是一种加速运行速率的策略,目标就是为了减少无效key的存储或者为我们释放出有用的空间来,达到数据的快速操作与利用,但是配置这些策略时会占用内存空间同时也会消耗掉CPU的性能
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态
XX :具有时效性的数据
-1 :永久有效的数据
-2 :已经过期的数据 或 被删除的数据 或 未定义的数据

数据通过EXPIRE、EXPIREAT、 PEXPIRE 、 PEXPIREAT 这四个指令可以设置过期时间,设置的name值有一个存储地址,把这个数据找到后 会开放一个空间expires,空间里放数据的存储地址和它的过期时间
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露
创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
优点:节约内存,到时就删除,快速释放掉不必要的内存占用
缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
总结:用处理器性能换取存储空间(拿时间换空间)
数据到达过期时间,不做处理。等下次访问该数据时, 如果未过期,返回数据
;发现已过期,删除,返回不存在
优点:节约CPU性能,发现必须删除的时候才删除
缺点:内存压力很大,出现长期占用内存的数据
总结:用存储空间换取处理器性能 (拿时间换空间)
注意:在调取任何获取的数据的操作前,内部都会执行expirelfNeeded()函数去判断是否过期
Redis启动服务器初始化时,读取配置server.hz(在server空间下,用info server就可以找到)的值,默认为10
每秒钟执行server.hz次serverCron()–>databasesCron()–>activeExpireCycle()
server.hz的值是控制频度的,对服务器进行定时轮训, 轮训去对databases里面的每个库进行轮训,
activeExpireCycle()对每个expires[]逐一进行检测,每次执行250ms/server.hz
对某个expires[]检测时,随机挑选W个key检测
如果key超时,删除key
如果一轮中删除的key的数量>W25%,循环该过程
如果一轮中删除的key的数量≤W25%,检查下一个expires[],0-15循环
W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
参数current_db用于记录activeExpireCycle() 进入哪个expires[] 执行
如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行
总结:
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
特点1:CPU性能占用设置有峰值,检测频度可自定义设置
特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
总结:周期性抽查存储空间
(随机抽查,重点抽查)
Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如
果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据
的策略称为逐出算法。
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所
有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
(error) OOM command not allowed when used memory >'maxmemory'
最大可使用内存:maxmemory (占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上)
每次选取待删除数据的个数:maxmemory-samples( 选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据)
删除策略:maxmemory-policy ( 达到最大内存后的,对被挑选出来的数据进行删除的策略)
检测易失数据(可能会过期的数据集server.db[i].expires )
① volatile-lru:挑选最近最少使用的数据淘汰
② volatile-lfu:挑选最近使用次数最少的数据淘汰
③ volatile-ttl:挑选将要过期的数据淘汰
④ volatile-random:任意选择数据淘汰
检测全库数据(所有数据集server.db[i].dict )
⑤ allkeys-lru:挑选最近最少使用的数据淘汰
⑥ allkeys-lfu:挑选最近使用次数最少的数据淘汰
⑦ allkeys-random:任意选择数据淘汰
放弃数据驱逐
⑧ no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)
使用INFO命令输出监控信息,查询缓存 hit (命中次数)和 miss(丢失次数) 的次数,根据业务需求调优Redis配置
设置服务器以守护进程的方式运行:daemonize yes|no
绑定可以访问的主机地址:bind 127.0.0.1 (只有绑定的ip可以访问)
设置服务器端口号:port 6379
设置数据库数量:databases 16
设置服务器以指定日志记录级别:loglevel debug|verbose|notice|warning
日志记录文件名:logfile 端口号.log
注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度
设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接:maxclients 0
客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0:timeout 300
在生产环境中可能会配置多个redis服务,但是他们的配置都差不多,所以可以先写个公共的配置文件,然后在自己的配置文件中用include引入就可以
导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护:include /path/server-端口号.conf
可以理解为:String中二进制位的操作接口,操作API有哪些

获取指定key对应偏移量上的bit值:getbit key offset
设置指定key对应偏移量上的bit值,value只能是1或0:setbit key offset value
注:
offfset:表示从什么位置改成值是什么,如setbit key 0 1 表示将key0位上的值改成1
偏移量:表示对应的位置offset)
业务场景
电影网站
统计每天某一部电影是否被点播
统计每天有多少部电影被点播
统计每周/月/年有多少部电影被点播
统计年度哪部电影没有被点播
业务分析

通过电影的名称获取到它对应的id,将id作为偏移量直接去拿就可以了
对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
bitop op destKey key1 [key2…]
and:交
or:并
not:非
xor:异或
统计指定key中1的数量
bitcount key [start end]
Tips 21:
redis 应用于信息状态统计
用途:统计不重复数据的数量
原始方案:set
存储每个用户的id(字符串)
改进方案:Bitmaps
存储每个用户状态(bit)
全新的方案:Hyperloglog
Hyperloglog是用来做基数统计的
基数是数据集去重后元素个数
HyperLogLog 是用来做基数统计的,运用了LogLog的算法
例如:
{1, 3, 5, 7, 5, 7, 8} 基数集: {1, 3, 5 ,7, 8} 基数:5
{1, 1, 1, 1, 1, 7, 1} 基数集: {1,7} 基数:2



添加数据:pfadd key element [element …]
统计数据:pfcount key [key …]
合并数据:pfmerge destkey sourcekey [sourcekey…]
如:

Tips 22:
redis 应用于独立信息统计
用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
核心是基数估算算法,最终数值存在一定误差
误差范围:基数估计的结果是一个带有 0.81% 标准错误的近似值
耗空间极小,每个hyperloglog key占用了12K的内存用于标记基数
pfadd命令不是一次性分配12K内存使用,会随着基数的增加内存逐渐增大
Pfmerge命令合并后占用的存储空间为12K,无论合并之前数据量多少
添加坐标点:geoadd key longitude latitude member [longitude latitude member …]
获取坐标点:geopos key member [member …]
计算坐标点距离:geodist key member1 member2 [unit]
计算经纬度:geohash key member [member …]
注:
longitude:横坐标
latitude :纵坐标
member:地点的名称(如饭店名)
unit:单位(m km等)
例如:

根据坐标求范围内的数据:
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
根据点求范围内的数据:
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
如:

Tips 23:
redis 应用于地理位置计算