目录
Redis能做什么:
redis特点
redis优点
opsForValue
opsForList
opsForSet
opsForZSet
StringRedisTemplate与RedisTemplate区别点
redis是一个key-value。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
Redis能做什么:
1. 缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;
2.排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结 构能够非常方便搞定;
3. 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等, 这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某 个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力; 注:限速器也是对请求限流的一种实现方式。
4. 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同 爱好之类的功能;
5. 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比 如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用 List来完成异步解耦;
6. Session共享,默认Session是保存在服务器的文件中,即当前服务器,如果是集群服务,同一个 用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户 落在那台机器上都能够获取到对应的Session信息。
redis特点
- Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化。
- 与其它键值数据存储相比,Redis有一组相对丰富的数据类型
- Redis可以将数据复制到任意数量的从机中。
redis优点
- 异常快
- 支持丰富的数据类型
- 操作具有原子性
- 多实用工具
redis安装略
SpringBoot中使用
引入相关jar包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.3.8.RELEASE</version>
</dependency>
修改相关配置(可不用配置)
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=123456
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
上述两个步骤完成后,SpringBoot自动在Spring容器中配置一个redisTemplate的Bean,所以可以直接 使用redisTemplate。
使用Spring封装的RedisTemplate操作redis
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
使用:
opsForValue
opsForValue操作字符串
存:redisTemplate.opsForValue().set("name","tom");
取:redisTemplate.opsForValue().get("name")
失效时间:
设置失效时间 使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
- TimeUnit.DAYS //天
- TimeUnit.HOURS //小时
- TimeUnit.MINUTES //分钟
- TimeUnit.SECONDS //秒
- TimeUnit.MILLISECONDS //毫秒
结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果, 十秒之后返回为null
支持整型与浮点型(increment):
使用:template.opsForValue().increment("sex",1); System.out.println(template.opsForValue().get("sex")); 结果:1
APPEND
如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。如果键不存在,则它被创建并设 置为空字符串,因此APPEND在这种特殊情况下将类似于SET
使用:template.opsForValue().append("name"," hello"); System.out.println(template.opsForValue().get("name")); 结果:tom Hello
截取key所对应的value字符串 System.out.println("*********"+template.opsForValue().get("name",0,3)); 结果:tom
存储一个对象(此类必须先序列化实现接口Serializable)
RedisSerializer rs = new StringRedisSerializer();
redisTemplate.setStringSerializer(rs);
ValueOperations ops = redisTemplate.opsForValue(); ops.set("user",user);//放入redis
//取出对象
User setuser = (User) redisTemplate.opsForValue().get("user");
opsForList
opsForSet
opsForZSet
StringRedisTemplate与RedisTemplate区别点
1. 两者的关系是StringRedisTemplate继承RedisTemplate
2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面 的数据,RedisTemplate只能管理RedisTemplate中的数据。
3. (序列化类)RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据 先序列化成字节数组然后在存入Redis数据库。 StringRedisTemplate使用的是 StringRedisSerializer 使用时注意事项: 当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时 候,那么你就使用StringRedisTemplate即可。 但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从 Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
RedisTemplate使用时常见问题
redisTemplate 中存取数据都是字节数组。当redis中存入的数据是可读形式而非字节数组时,使用 redisTemplate取值的时候会无法获取导出数据,获得的值为null。