1、Redis持久化的几种方式
(1)RDB(Redis DataBase)持久化
(2)AOF(Append Only File)持久化
2、Redis的缓存失效策略
主要涉及到expire对主键过期时间的设置。
Redis对缓存失效的处理机制大概分为两种,一种是客户端访问key的时候消极的处理,一种是主线程定期的积极地去执行缓存失效清理逻辑
参考:Redis缓存失效机制 https://my.oschina.net/andylucc/blog/679222
3、Redis和Memcached的区别
Redis的特性:
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持字符串、链表、哈希、集合和有序集合
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
与Memcached的区别在于:
(1)、存储方式
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis有部分存在硬盘上,这样能保证数据的持久性。
(2)、数据支持类型
Memcache对数据类型支持相对简单。Redis有复杂的数据类型。
(3)、使用底层模型不同
它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。
Redis直接自己构建了VM(Virtual Memory)机制 ,因为一般的系统调用系统函数的话(例如java调用自己的API),会浪费一定的时间去移动和请求。
4、Redis分布式锁的实现
Redis的分布式缓存特性使其成为了分布式锁的一种基础实现。通过Redis中是否存在某个锁ID,则可以判断是否上锁。为了保证判断锁是否存在的原子性,保证只有一个线程获取同一把锁,Redis有SETNX(即SET if Not
eXists)和GETSET(先写新值,返回旧值,原子性操作,可以用于分辨是不是首次操作)操作。
关于SETNX:
将 key
的值设为value
,当且仅当 key
不存在,返回值为1。
若给定的 key
已经存在,则 SETNX 不做任何动作,返回值为0。
为了防止主机宕机或网络断开之后的死锁,Redis没有ZK那种天然的实现方式,只能依赖设置超时时间来规避。
以下是一种比较普遍但不太完善的Redis分布式锁的实现步骤(与下图一一对应):
(1)线程A发送SETNX lock.orderid 尝试获得锁,如果锁不存在,则set并获得锁。
(2)如果锁存在,则再判断锁的值(时间戳)是否大于当前时间,如果没有超时,则等待一下再重试。
(3)如果已经超时了,在用GETSET lock.{orderid} 来尝试获取锁,如果这时候拿到的时间戳仍旧超时,则说明已经获得锁了。
(4)如果在此之前,另一个线程C快一步执行了上面的操作,那么A拿到的时间戳是个未超时的值,这时A没有如期获得锁,需要再次等待或重试。
参考:
(1)基于redis分布式锁实现“秒杀” http://blog.csdn.net/u010359884/article/details/50310387
(2)http://blog.csdn.net/ugg/article/details/41894947
5、Redis的Reactor模式
参考 :
(2)《Redis设计与实现》中的第151页
6、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供6种数据淘汰策略:
(1)volatile-lru: 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
(2)volatile-ttl: 从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
(3)volatile-random: 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
(4)allkeys-lru: 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
(5)allkeys-random: 从数据集(server.db[i].dict)中任意选择数据淘汰
(6)no-eviction(驱逐):禁止驱逐数据