初识redis及实现session共享

1.Redis介绍及安装

Redis是当前比较热门的NOSQL系统之一, 它是一个key-value存储系统,和memcached相似,但在很大程度上补足了memcached的不足,它支持存储的value类型相对较多,包括String,List,Set和Hash,这些数据类型都支持push/pop,add/remove操做,在此基础上,redis支持各类不一样方式的排序,Redis数据都是缓存在计算机内存中, 而且会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件程序员

redis官网地址: http://redis.io/web

Redis优点

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。redis

  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操做。spring

  • 原子 – Redis的全部操做都是原子性的,同时Redis还支持对几个操做全并后的原子性执行。数据库

  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过时等等特性。centos

Redis与其余key-value存储有什么不一样?

  • Redis有着更为复杂的数据结构而且提供对他们的原子性操做,这是一个不一样于其余数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。缓存

  • Redis运行在内存中可是能够持久化到磁盘,因此在对不一样数据集进行高速读写时须要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另外一个优势是,相比在磁盘上相同的复杂的数据结构,在内存中操做起来很是简单,这样Redis能够作不少内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,由于他们并不须要进行随机访问session

 

安装步骤:

  1. 下载redis数据结构

$ wget http://download.redis.io/releases/redis-2.8.3.tar.gz
$ tar -zxvf redis-2.8.3.tar.gz 
$ cd redis-2.8.3
$ make

   安装redis可能会出现下面的错误并发

#make
cd src && make all
make[1]: Entering directory `/software/redis-2.8.8/src'
    CC adlist.o
In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/software/redis-2.8.8/src'
make: *** [all] Error 2

解决方案执行下面的命令

安装gccyuan

yum -y install gcc*

make MALLOC=libc

缘由是没有安装jemalloc 内存分配器,能够安装 jemalloc 

    2. 编译完成, 进入src目录下有四个可执行文件redis-server, redis-benchmark, redis-cli和redis.conf

    3. 用客户端测试

jchen19@server1:~$ redis-cli
redis 127.0.0.1:6379> set name "test"
OK
redis 127.0.0.1:6379> get name
"test"
redis 127.0.0.1:6379> set foo "bar"
OK
redis 127.0.0.1:6379> get foo
"bar"
redis 127.0.0.1:6379>

   至此redis已经成功安装

centos安装redis可经过如下命令完成:

yum install redis

启动redis

service redis start

 

Redis经常使用命令介绍

1.插入数据
redis 127.0.0.1:6379> set name "test"
OK
设置一个key-value对

2.查询数据
redis 127.0.0.1:6379> get name
"test"

取出key所对应的value

3.删除键值
redis 127.0.0.1:6379>del name
删除这个key及对应value

4.验证键是否存在
redis 127.0.0.1:6379>exists name
(integer)0
其中0表明key不存在, 1表明存在

 

2.Redis使用场景介绍

  • 最经常使用的就是会话缓存(session cache):redis 相比其余缓存如memcache 的优点在于:提供持久化
  • 全页缓存
  • 队列 (redis提供了list和set操做)
  • 排行榜/订阅器
  • 发布和订阅
  • redis是单线程的 能够用来处理高并发的问题

 

实现session共享

引入依赖

<dependency>
     <groupId>org.springframework.session</groupId>
     <artifactId>spring-session</artifactId>
     <version>1.2.2.RELEASE</version>
 </dependency>
 <dependency>
     <groupId>org.springframework.session</groupId>
     <artifactId>spring-session-data-redis</artifactId>
     <version>1.2.2.RELEASE</version>
 </dependency>
 <dependency>
     <groupId>org.springframework.data</groupId>
     <artifactId>spring-data-redis</artifactId>
     <version>1.7.2.RELEASE</version>
     </dependency>
<dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
     <version>2.9.0</version>
</dependency>

web.xml中添加filter

<filter>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 </filter>
 <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
 </filter-mapping>

 

配置redis

@Configuration
@EnableCaching
@EnableRedisHttpSession
public class SpringRedisConfig extends CachingConfigurerSupport {

    @Bean
    public JedisConnectionFactory redisConnectionFactory() {
        JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
        redisConnectionFactory.setHostName(getRedisUrl());
        redisConnectionFactory.setPort(Integer.parseInt(getRedisPort()));
        redisConnectionFactory.setPassword(getRedisPassword());
        return redisConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(cf);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisTemplate<String, Long> longRedisTemplate() {
        final RedisTemplate<String, Long> template = new RedisTemplate<String, Long>();
        template.setConnectionFactory(redisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericToStringSerializer<Long>(Long.class));
        template.setValueSerializer(new GenericToStringSerializer<Long>(Long.class));
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate<String, String> redisTemplate) {


        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);

        // 启用前缀后,生成的key会自动加上cache名称,至关于命名空间。最终的缓存key为cachename:key的方式。
        cacheManager.setUsePrefix(true);

        ArrayList<String> cacheNames = new ArrayList<String>();
        cacheNames.add("campInfo");
        cacheNames.add(ConfigService.getAppConfig().getProperty("DUPLICATE_REMOVAL", ""));
        cacheManager.setCacheNames(cacheNames);

        Map<String, Long> cacheExp = new HashMap<String, Long>();
        cacheExp.put("campInfo", new Long(172800));
        cacheExp.put(ConfigService.getAppConfig().getProperty("DUPLICATE_REMOVAL", ""), new Long(60));
        cacheManager.setExpires(cacheExp);

//	    // 设置默认失效时长为7200秒
//	    cacheManager.setDefaultExpiration(7200);

        return cacheManager;
    }


    protected String getRedisUrl() {
     
        return "192.168.102.255";
    }

    protected String getRedisPort() {
     
        return "6379";
    }

    protected String getRedisPassword() {
 
        return "123";
    }
}
相关文章
相关标签/搜索