初识redis及实现session共享

时间秒杀一切 提交于 2019-12-12 12:51:10

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1.Redis介绍及安装

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

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

Redis优势

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

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

  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

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

Redis与其他key-value存储有什么不同?

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

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

 

安装步骤:

  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";
    }
}

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!