1.redis支持5种数据结构
1)String
2)hash
可以作为单点登录,把cookieid储存起来,设置过期时间
3)set
set本身无序的,可以作为全局去重功能,jvm的set也是无序不重复的,如果是集群的话就起不到这个作用,所以redis可以很好解决
4)sorted set
有序集合,可以完成排名榜的功能,如果用mysql建立索引查询,速度会比较慢
5)list
2.redis优点
1)redis是单线程工作模型,避免了频繁的上下文切换
2)纯内存操作
3)采用无堵塞IO多路复用机制(一个线程,记录多个IO状态,来管理多个IO流)
3.redis缺点
1)缓存击穿,雪崩
2)缓存高并发竞争问题
3)缓存和数据库一致性问题
解决方案:
缓存击穿,雪崩都是缓存失效,直接怼上数据库,造成数据库连接失败
所以:
可以让他们抢分布式锁,抢到了再查询数据库
或者是让数据失效的时间+随机数,不至于同一个时间集体失效
缓存和数据库一致性问题
采用先删缓存,再更新数据库做法。为啥不更新缓存,再更新数据库呢?由于网络延迟,高并发,要保持缓存和数据库强一致性是比较难的,如果数据要求强一致性,建议不要使用缓存。只能保证最后缓存和数据库最终一致性。
还有一个是这个方案可以产生的读到脏数据的情况:
A删缓存,
B发现没有缓存,去数据库读取旧数据,
A更新数据库,
B更新缓存。
so缓存一直是旧数据。
解决方案是:在A写入数据库之后隔着一个时间(如1秒)删除缓存,即删除脏数据。
4.redis key失效策略
采用定期删除和惰性删除