基本概念
redis 开源的高性能的,c语言开发的,键值对存储数据的nosql(非关系型数据库)数据库。
数据库发展历史:
单数据库实例
缓存(ehCache)+数据库实例
缓存(ehCache)+主从数据库+读写分离
缓存+主从数据库集群+读写分离+分库分表
nosql+主从数据库集群+读写分离+分库分表
作用:快速存取
redis应用场景
单点登录
限时秒杀
排行耪
点赞 评论 访问统计 舍弃了数据的绝对精确
记录在线列表
五种数据类型及其应用
string hash list set zset
String
set key value
get key value
mset key1 value1 key2 value2
del key
应用场景:秒杀
set key 100
get key
Decr key 1
incr key 2
hash (map<Object,Object)
应用场景:商品的详细信息
hset key:name:手机 id 001
hget key:name:phone id ----->001
hmset key:name:phone id 001 price 1999
hmget key:name:phone id price
hgetall key:name:phone
list(linkedList,有序非唯一)
lpush commemt:test 1 2 3
rpush comment:test 4 5 6
321456
lrang comment:test 0 10
应用场景:商品的评论列表
lpush comment:bra:vidolia {comment:id,commentContent:"good",commentPice:"lef/tpc.png"}
set(set无序 唯一)
应用场景:ip投票的限制、共同好友
sadd key value1 value2 value3 value4
srem key value1
sismember key value5
sinter key1 key2(交集)
Zset(有序set集合)
应用场景:商品排行榜
zadd key 100 华为 99 苹果 98 vivo 97 oppo
zscore key 华为
zrange key 0 -1 withsocres(升序)
zrevrange key 0 -1 withsocres(降序)
其他
删除所有key:flushdb
java 操作redis Jedis spring集成
redis的主从复制、集群、持久化aof(不停备份数据)和rdb(每次操作的日志)
redis三大问题
redis缓存穿透解决
- 缓存空对象
- 自写布隆过滤器,将数据先查询到布隆过滤器,有请求过来就先判断布隆过滤器有没有,有就查询,没有就返回非法请求,每次有新增操作时,需要将数据加入到布隆过滤器,删除数据过多时,需要重建布隆过滤器(设置插入数据量和容错率(哈希函数的个数越多,容错率越低,开销率越大),实际是存了三个hash;布隆出错的原因:hash碰撞;出错率跟数组长度和hash表大小有关)
不使用谷歌框架的过滤器:谷歌框架使用的是jwt的内存,位数组为21亿(int);
redis使用的redis的内存,位数组为42亿(String)。
redis底层保存数据是位数组,redis可实现数组扩容。位符
布隆过滤优缺点:占用内存小,会出现误判,需要维护,不能删除数据。
redis缓存击穿解决
缓存当中没有,数据库有数据(并发)
当缓存中没有,先加分布式锁,再去数据库查,查完将数据放到redis,最后释放锁。
redis缓存雪崩解决
过期时间错开、搭建高可用集群cluster