简介




redis在项目中的应用 redis在项目中的作用_java


Redis(redis.io) 是一个高性能的key-value数据库。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端

特性

  1. Redis是单线程;
  2. Redis支持数据的持久化;
  3. Redis支持主从同步 数据可以从主服务器向任意数量的从服务器上同步;
  4. Redis的所有操作都是原子性的;
  5. Redis 具有publish/subscribe特性, 设置key有效期等

作用

查询内存比查询数据库效率高,辅助存储,减轻数据库压力

场景

热点缓存、session共享、分布式锁、自增id、验证码等

数据模型

1. String:最常规的set/get操作,value可以是String也可以是数字。一般做一些计数功能的缓存,又或者存session等;

2. Hash:Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象;

3. List:使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能;

4. Set:因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能 可以计算共同喜好,全部的喜好,自己独有的喜好等功能;

5. sorted set:sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作

常见应用

消息中间件
使用Redis发布/订阅进行进程间通信


redis在项目中的应用 redis在项目中的作用_redis作用_02


缓存同步

使用Redis发布/订阅特性配合谷歌GuavaCacheManager组件实现缓存数据的即时同步

Session共享

@EnableRedisHttpSession这个注解是由spring-session-data-redis提供的。通过EnableRedisHttpSession注解来开启spring session支持


redis在项目中的应用 redis在项目中的作用_redis作用_03


热点数据存储

很常见的场景用于统计网站访问数量,当前在线人数等

问题总结

Redis单Key大数据

所谓的大key就是存储本身的key值空间太大,或者hash,list,set等存储中value值过多。

影响:查询慢,影响正常业务访问;单线程,使得其他请求阻塞;元素个数建议尽量不要超过5000

解决:将大key进行分割,根据业务数据的某个特性维度,均匀划分成若干个子key

关于RedisTemplate里存取Long类型

存入Long类型对象,在代码中使用Long类型接收,结果报类型转换错误:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

原因:取值过程中将结果反序列化为Object类型,所以这里便是问题的根源所在,对于数值类型,取出后统一转为Object,导致泛型类型丢失,数值自动转为了Integer类型

redis的过期策略以及内存淘汰机制

redis采用的是定期删除+惰性删除策略

redis默认每个100ms检查,是否有过期的key,有过期key则删除

redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查,惰性删除派上用场

定期删除没删除key,也没即时去请求key 内存淘汰机制?

在redis.conf中有一行配置

# maxmemory-policy volatile-lru //移除最近最少使用的key
noenviction(驱逐):不删除任意数据会直接返回错误