《Redis设计与实现》目录索引
intro 目录索引 Part01-第01~08章 Part02-第09~14章 Part03-第15~17章 Part04-第18~24章
intro 目录索引 Part01-第01~08章 Part02-第09~14章 Part03-第15~17章 Part04-第18~24章
1. 使用set key value nx 实现锁 acquire: set key value nx , 根据返回值判断是否加锁成功 release: delete key 2. ID生成器 3. 限速器 信号量 4. 短网址实现 给网址一个递增的整数id,然后将这个十进制id转换为36进制数(0到9+26个数字) 细节上,可以给id一个偏移,使得转换后的短网址不太短 5. 实现用户登录会话 6. 使用集合实现唯一计数器 7. 打标签 (集合) 8. 点赞 (集合) 点赞:往集合里加用户 取消赞:从集合里去除用户 9. 投票 (集合) 一个集合保存赞成 一个集合保存反对 10. 社交关系 集合s1记录关注名单 集合s2记录粉丝 如果A关注了B,那么A的s1中添加B,B的s2中添加A。 同时非常方便判断是不是互相关注 11. 抽奖 srandmember 12. 共同关注与推荐关注 共同关注:sinter 推荐关注:从关注用户的关注用户的集合取交集,并随机返回 13. 反向筛选器 给商品添加多个标签 然后通过标签选多个商品 14....
intro 目录索引 第02~10章-数据结构与应用 第11章-数据库 第12章-自动过期 第13章-流水线与事务 第14章-lua脚本 第15章-持久化 第16章-发布与订阅 第17章-模块 第18章-复制 第19章-sentinel 第20章-集群 Redis应用大全
1. 字符串 1.1 为字符串键设置值 1 set key value [NX|XX] NX:key不存在时才设置。若存在,则放弃设置,并返回nil XX:key存在时才设置。若存在,设置成功后返回ok,否则不存在,返回nil。 1.2 获取字符串键的值 1 get key 1.3 GETSET: 获取旧值并设置新值 1 getset key value 如果key之前不存在,那么返回值是nil 1.4 删除键 1 del key 返回值代表操作了多少项 1.5 MSET:一次为多个字符串键设置值 1 mset key1 value1 [key2 value2] mset的意义,在于可以用其实现patch的功能,节约网络通信的重复开销 1.6 MGET:一次获取多个字符串键的值 1 MGET key [key ...] 若某个key不存在,则返回nil 1.7 MSETNX: 只在键全部不存在的情况下,一次设置多个键的值 1 MSETNX key value [key value] 若其中某个key已存在,则返回0...
11.1 SELECT:切换至指定数据库 1 select index 默认使用0号数据库,命令行不会打印出index 如果使用其他数据库,客户端命令行将会有对应的index进行标识 11.2 keys 获取数据库中与给定匹配符相匹配的全部键键名 1 SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] keys * 获取当前数据库全部键名 11.3 SCAN:以渐进的方式迭代数据库中的键 scan扫描的是数据库里的键,而不是键里的数据 一次性返回全部查询结果可能会对服务器造成巨大负担,scan就是用来解决这个问题。 scan的问题: 新增数据,新数据是否会在接下来的扫描中返回是不确定的 删除数据,删除操作发生在扫描之前,那么数据被返回了,但扫描仍旧未结束 其他数据结构对应的scan HSCAN SSCAN ZSCAN 11.4 RANDOMKEY:随机返回一个key 11.5 SORT:对键的值进行排序 默认值的数值进行排序 对字符串进行排序时,指定alpha 指定升序asc和降序desc limit, offset, count 获取外部键的值作为结果 使用外部键的值作为排序权重 指定存储的键 11.6 EXISTS:检查给定的一个或多个键是否存在 11.7 DBSIZE:获取数据库包含的键值对数量 11....
12.1 EXPIRE、PEXPIRE:设置生存时间 EXPIRE 设置秒级 PEXPIRE 设置毫秒级 为已有生存时间的键设置生存时间时,会覆盖并重新开始计时。 12.2 SET命令的EX选项和PX选项 12.3 EXPIREAT、PEXPIREAT:设置过期时间 EXPIREAT 接受一个秒级精度的UNIX时间戳 PEXPIREAT 接受一个毫秒级精度的UNIX时间戳 12.4 自动过期特性不足之处 只能对某个键设置,不能对键中某个元素进行设置 12.5 TTL、PTTL:获取键的剩余生存时间 TTL 返回值的单位是秒 PTTL 返回值的单位是毫秒
流水线 流水线特性允许客户端把任意多条redis命令请求打包在一起,等待服务器将请求完全处理后,一次性将执行结果返回客户端(即批处理思想) 注意事项: redis服务器为每个客户段设置的输入缓冲区设置默认值为1GB上限(待验证),超过这个值,服务器将会强行关闭该客户端 事务 redis事务特性: 将多个redis命令打包成一个事务,当事务成功执行,意味这其中所有的命令执行成功 如果事务没有执行成功,那么它包含的所有命令都不会被执行 事务的安全性 redis事务总是具有 ACID 中的 ACI 性质 原子性A:事务中的所有命令要么都执行,要么都不执行 一致性C:确保逻辑一致 隔离性I:每个Redis事务独立执行,不同事务之间不会互相干扰 当redis运行在特定的持久化模式下,redis事务也具有持久性D,当事务执行完毕时,它的结果将被存储在硬盘中 实践:避免在事务中执行过多命令或执行大量计算,以免造成服务器阻塞 使用multi和exec开启一次事务 1 2 3 4 multi set test1 "1" set test2 2 exec 按顺序返回事务中所有命令的返回值 将exec替换成discard,将丢次此次事务 流水线与事务 很多redis客户端都会使用流水线去包裹事务命令,等到用户输入 exec 命令后,再将所有事务命令通过流水线一并发送至服务器 watch:对键进行监听 客户端要求服务器对一个或多个键进行监听,如果在客户端尝试执行事务之前,这些键值发生变化,那么服务器将拒绝执行客户端发送的事务,并返回一个空值: 1 watch key [key ...] watch + multi 实现事务 使用watch + multi, 确保事务只会在被监视键没有发生任何变化的情况下执行,从而保证事务对被监听键的所有修改都是安全的、正确的、有效的 unwatch:取消对键的监听
redis从2.6.0版本引入对lua的支持 redis服务器以原子方式执行lua脚本,在执行完整个lua脚本前服务器不会执行其他客户端的命令或脚本(即阻塞其他客户端发送的命令执行) 如何使用redis的lua脚本特性 如何管理脚本 如何使用lua环境内置的函数库 如何调试脚本 14.1 EVAL:执行脚本 1 eval script numKeys key [key ...] arg [arg ...] 其中: script 指的是lua脚本 numKeys 指定了有多少个key,后面紧跟这么多个key。在lua中,可以通过KEYS数组进行访问,1-index 任意个arg,lua脚本中通过ARGV数组进行访问,1-index 14.1.1 在lua脚本中使用redis服务器提供的命令 redis.call() redis.pcall() 执行遇到错误时会返回一个包含错误信息的lua表格 14.1.2 值转换 当脚本调用redis.call()的时候,传入的lua值将会被转换成redis协议的值 redis.call()返回值将会从redis值被装换为lua值 lua脚本执行结束时,将会把lua值转换为redis协议值 将redis协议值转换成lua值的规则 将lua值转换为redis协议值的规则 注意: 因为浮点数的lua值被转换为redis值时会被强转为整型,需要有意识的用lua的tostring()转换后再返回给redis 在脚本中切换数据库 14.2 SCRIPT LOAD 和 EVALSHA: 缓存、执行脚本 SCRIPT LOAD 将lua脚本加载到redis服务器中,并返回标识脚本的sha1值: 1 SCRIPT LOAD script EVALSHA 根据提供的sha1值调用对应的lua脚本 :...