一、事务简介
1、什么是事务
redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列),当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。
2、事务的基本操作
开启事务:
**multi**
- 作用:设定事务的开启位置,此指令执行后,后续的所有指令都将加入到事务中
- 执行事务:
**exec**
- 作用:设定事务的结束位置,同时执行事务。与multi成对出现,成对使用。
- 注意:当命令添加到任务队列中,并没有立即执行,只有执行了 exec 命令才开始执行
- 取消事务:
**discard**
作用:终止当前事务的定义[直接销毁队列],发生在multi之后 exec之前
3、事务的注意事项
定义事务的过程中,命令格式输入错误怎么办?
- 语法错误:指命令书写格式有误。
- 处理结果:如果 定义的事务中所包含的命令存在语法错误,整体事务中所有命令都不会执行,不包括哪些语法正确的命令。
定义事务的过程中,命令执行出现错误怎么办?
对key添加监视锁,在执行exec前如果key发行了变化,终止事务执行
**watch **``key [key2 …]
- 取消对所有key的监视
**unwatch**
2、基于特定条件的事务执行—-分布式锁
解决方案 [解决超卖问题]
- 使用setnx 设置一个公共锁 [setnx 如果存在就不执行 如果不存在就执行]
**setnx **``lock-key value
- 利用setnx 命令的返回值特征,有值返回设置失败,无值则返回设置成功
- 对于返回设置成功的,拥有控制权,进行下一步的具体业务操作。
- 对于返回设置失败的,不具有控制权,排队或等待
- 操作完毕后使用 del 指令将 这个锁删掉即可
- 处理思路:用户在购买最后一个东西时,先执行一下
setnx lock-goods 1
如果返回成功的话就可以买,如果返回失败就说明最后一个商品别人在买,别人买完后 执行以下del`` lock-goods
删掉锁 注意:上述解决方案是一种设计概念,依赖规范保障,具有风险性。
3、基于特定条件的事务执行 — 分布式锁改良
业务场景:依赖分布式锁的机制,某个用户操作时对应客户端宕机,且此时用户已经获取到锁,如果解决?【死锁】
- 解决:使用expire为锁key添加时间限定,到时不释放,放弃锁
**expire**`` lock-key second
【为指定的key 设置有效期 秒级单位】**pexpire **``lock-key milliseconds
【为指定的key设置有效期 毫秒级】
- 由于操作通常都是微秒或者毫秒级,因此该锁定时间不宜设置过大,具体时间需要业务测试后确认
三、高级-删除策略
1、过期数据
redis中的数据特征
- redis是一中内存级别数据库,所有数据都存放在内存中,内存中的数据可以通过TTL指令获取其状态
- XX:具有时效性的数据
- -1:永久有效的数据
- -2:已经过期的数据或者被删除的数据或未定义的数据
redis中的过期数据不会直接删掉而是会通过删除策略来删除,删除策略:
- 定时删除
- 惰性删除
-
数据删除策略的目标
在内存占用与CPU之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄漏【CPU忙着处理set get 就不要执行del 了 CPU闲了再去删除】
2、定时删除
创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即实行对键的删除操作。
- 优点:节约内存,到时就删除,快速释放掉不必要的内存占用。
- 缺点:CPU压力很大,无论CPU此时负载量多高,均会占用CPU,会影响redis服务器响应时间和指令吞吐量。
-
3、惰性删除
数据到达过期时间,不做处理,等下次访问该数据时处理
- 如果未过期,返回数据
- 如果已过期,删除,返回不存在
- 优点:节约CPU性能,发现必须删除的时候才删除
- 缺点:内存压力很大,出现长期占用内存的数据。
-
4、定期删除
周期性轮询redis库中的有效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
- 特点1:CPU性能占用设置有峰值,检测频度可自定义设置。
- 总结:周期性抽查存储空间(随机抽查,重点抽查)
5、逐出算法
当新数据进入redis是,如果内存不足怎么办。
- Redis使用内存存储数据,在执行每一个命令前,会调用freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据 的策略称为逐出算法。
- 注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
影响数据逐出的相关配置
**maxmemory**
【最大可使用内存】- 占用物理内存的比例,默认值为0,表示不限制,生产环境中根据需求设定,通常设置再50%以上。
**maxmemory-samples **
【每次选取待删除数据的个数】- 选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能,因此采用随机获取数据的方式作为待检测删除数据
**maxmemory-policy**
【删除策略】- 达到最大内存后的,对被挑选出来的数据进行删除的策略。
- 再配置文件上写
**maxmemory-policy**``volatile-lru
(下面都可选,这个是最优方案)
四、高级-redis.conf
1、服务器端设定
- 设置服务器以守护进程的方式运行
**daemonize yes|no **
- 绑定主机地址 [如果绑定了那么只能用这个ip访问redis]
**bind 127.0.0.1**
- 设置服务器端口号
**port 6379 **
设置数据库数量
设置服务器以指定日志记录级别
**loglevel **``debug``**|verbose|**``notice``**|**``warning
- 日志记录文件名
**logfile 端口号.log**
注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写日志IO的频度
3、客户端配置
设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
**maxclients 0**``**【**``**0**``**表示随便连】**
客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为 0
导入并加载指定配置文件信息,用于快速创建redis公共配置较多的redis实例配置文件,便于维护
**include /path/server-端口号.conf**
五、高级-高级数据类型
1、Bitmaps
- bit:0000 0000 【对这8操作个0进行】
- Bitmaps 类型的基础操作
- 获取指定key对应偏移量上的bit值
**getbit **``key offset
【offset 哪一位】
- 设置指定key对应偏移量上的bit值,value只能是1或者0
**setbit **``key offset value
- 获取指定key对应偏移量上的bit值
- Bitmaps拓展操作
- 对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
**bitop op destKey key1 [key2...]**
- and:交
- or:并
- not:非
- xor:异或
- 统计指定key中1的数量
**bitcount key [start end]**
- 对指定key按位进行交、并、非、异或操作,并将结果保存到destKey中
Tips 21: redis 应用于信息状态统计
2、HyperLogLog
- 统计不重复数据的数量 基数统计[数据元素集合去重后的元素个数]
- {1,3,5,7,9,2,4,7,7} 基数集 {1,3,5,9,7} 基数:5
- HyperLogLog 类型的基本操作
- 添加数据
**pfadd key element [element ...] **
- 统计数据
**pfcount key [key ...] **
- 合并数据
**pfmerge destkey sourcekey [sourcekey...]**
- 添加数据
相关说明
Redis GEO的坐标系用的是国际通用的WGS84,你直接用高德地图的坐标系存进去虽然也能用,但会有误差,对精度要求不高也就算了,要是要求高的话就转成WGS84再存进去
geo的基本操作
- 添加坐标点
**geoadd key longitude横坐标 latitude纵坐标 member [longitude latitude member ...]**
- 获取坐标点
**geopos key member [member …**``**]**
- 计算坐标点距离
**geodist key member1 member2 [unit]**
- 添加坐标点
**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]**
- 计算经纬度
**geohash key member [member ...]**