redis-五种数据类型入门到实例精通

初始-redis

特点:

  1. 速度快
  2. 数据存在内存中。
  3. C语言实现,“距离”操作系统越近执行速度越快。
  4. 单线程,预防了多线程可能产生的竞争问题。
  5. Redis源代码精打细磨。
  6. 键值对的数据结构存储
  7. 五中键值对的形式,许多的应用场景,提高开发效率。
  8. 功能多
  9. 键过期
  10. 发布订阅
  11. lua脚本
  12. 事务功能
  13. 流水线
  14. 简单稳定
  15. 源码少
  16. 单线程
  17. 不需要依赖操作系统的类库,自己实现了事件处理的先关功能。
  18. 稳定到几乎没有宕机的情况。
  19. 客户端语言多
  20. 提供了TCP通信协议,很多编程语言可以很方便的接入到Redis。
  21. 持久化
  22. RDB和AOF
  23. 主从复制
  24. 高可用和分布式

应用场景

  1. 缓存
  2. 访问快
  3. 降低后端数据源的压力
  4. 键值过期,灵活控制最大内存和内存溢出后的淘汰策略。
  5. 排行榜系统
  6. 利用列表和有序集合的数据结构
  7. 计数器应用
  8. 利用加1操作
  9. 社交网络
  10. redis提供的数据结构更好实现:赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等。
  11. 消息队列

不适合的应用

  1. 冷数据。
  2. 数据规模相对比较大的。

应用

全局命令

  1. 查看所有键
  2. keys *
  3. 当存储特别键的时候谨慎使用
  4. 键总数
  5. dbsize
  6. 键是否存在
  7. exists key
  8. 存在返回1,不存在返回0。
  9. 删除键
  10. del key 【键名字】
  11. 返回删除键的个数,不存在返回0。
  12. 支持删除多个键:del a b c
  13. 键过期
  14. expire 【key】【seconds】
  15. ttl 【key】查看键剩余时间。
  16. 返回大于等于0的整数。-1:键没设置过期时间。-2键不存在。
  17. 键的数据类型
  18. type 【key】
  19. 键不存在返回none

数据类型和内部编码

数据类型都有自己的实现编码,多种实现。redis会在合适的场景选择合适的内部编码。
查看内部编码命令:object encoding hello
redis-五种数据类型入门到实例精通_第1张图片

Redis设置内部编码的两个好处。

  1. 改进内部编码对外的数据结构和命令没有影响。对用户基本感知不到。
  2. 数据类型的多种实现编码在不同环境会转换。例如列表的内部编码,ziplist比较节省内存,但是在列表元素比较多的情况下,性能会有所下降,这时redis会根据配置选项列表类型的内部实现转换为linkdlist。

五种类型

  1. 字符串
  2. 常用命令
  3. 内部编码3种
  4. int:8个字节的长整型。
  5. embstr:小于等于39个字节的字符串。
  6. raw:大于39个字节的字符串。
  7. 应用场景
  8. 缓存功能(常用)
  9. 计数——利用自增1。
  10. 共享Session
  11. 限速——一分钟不超过5次,利用键过期和自增/自减。
  12. value值最大为512MB
  13. 哈希hash——value={{field1,value1},…{fieldN,valueN}}
  14. 常用命令
  15. 内部编码,两种
  16. ziplist(压缩列表):哈希类型的元素个数小于hash-max-zoplist-entries配置(默认512个)。所有值都小于hash-max-ziplist-value配置(默认64字节)。ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
  17. hashtable(哈希表):当ziplist无法满足哈希的条件时,元素多于512个或value大与64字节时ziplist的读写速度效率会下降。redis会转换成hashtable实现,读写快。
  18. 应用场景
  19. 哈希来存储关系型数据表记录。
  20. 需要注意的是哈希类型是稀疏的,而关系型数据库是完全结构化的。关系型数据库可以做复杂的关系查询,redis很难。
  21. 三种实现的优缺点
  22. 原声字符串类型:每个属性一个键
  23. set user:1:name tome
  24. set user:1:age 23
  25. set user:1:city beijing
  26. 优点:简单直观。
  27. 缺点:占用过多的键,内存占用量较大,同时用户信息内举行比较差,一般不会在生产环境使用。
  28. 序列化字符串类型:将用户信息序列化用一个键保存。
  29. set user:1: serialize(userInfo)
  30. 优点:简化编程,如果合理的使用序列化可以提高内存的使用效率
  31. 缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到redis中。
  32. 哈希类型:每个用户属性使用一对field-value,但是只用一个键保存。
  33. hmset user:1: name tom age 23 city beijing
  34. 优点:简单直观如果使用合理可以减少内存空间的使用
  35. 缺点:控制哈希在ziplist和hashtable两种内部编码的转化,hashtable会消耗更多内存。
  36. 列表list——列表最多存储2的23次方,减一个元素。列表在两端进行插入和弹出。
  37. 特点:1、列表中的元素是有序的,通过索引小标获取某个元素和某个范围的元素列表。2、元素可重复。
  38. 常用命令
  39. 内部编码
  40. ziplist(同上)
  41. linkedlist(链表):当ziplist无法满足列表条件时,redis会使用linkedlist作为列表的内部实现。
  42. 应用场景
  43. 消息队列
  44. 利用redis的lpush+brpop命令实现阻塞队列,多客户端使用brpop命令阻塞式的“抢”列表儿,多客户端保证了消费的负载均衡和高可用行。
  45. 文章列表
  46. 利用列表的有序性,不仅有序,同时支持索引范围获取元素。
  47. 其余
  48. lpush+lpop = Stack(栈)
  49. lpush+rpop = Queue(队列)
  50. lpush+ltrim = Capped Collection(有限集合)
  51. lpush+brpop = Massage Queue(消息队列)
  52. 集合set——保存多个元素,不予许重复并且元素无序。一个元素最多可存储2的32次方,减一个元素。支持多个集合的交集、并集、差集,合理地使用好集合类型解决很多实际问题。
  53. 常用命令
  54. 集合内添加元素
  55. sadd 【key】【 element element…】
  56. 返回结果为添加成功的个数。
  57. 删除元素
  58. srem 【key】【element element…】
  59. 返回删除成功的个数。
  60. 计算元素个数
  61. scard 【key】
  62. 判断元素是否在集合中
  63. sismemeber 【key】【element】
  64. element在集合中返回1,反而为0。
  65. 随机从集合返回指定个数元素
  66. srandmember 【key】[count]
  67. count是可选参数,不写默认为1
  68. 从集合随机弹出元素
  69. spop 【key】
  70. redis3.2版本开始支持spop[count]参数。
  71. 与srandmember的区别,spop弹出后在集合中删除了。
  72. 获取所有元素
  73. smembers 【key】
  74. 当元素比较多时可能会发生阻塞
  75. 集合间操作多个集合的交集
  76. sadd user:1:follow it music his sports
  77. sadd user:2:follow it news ent sports
  78. 交集:sinter 【key1 key2】
  79. 并集
  80. sunion 【key1 key2】
  81. 差集
  82. sdiff 【key1 key2】
  83. 返回key1的字符
  84. 交并差的结果保存
  85. sinterstore key1_2 【key1 key2】
  86. sunionstore key1_2 【key1 key2】
  87. sdiffstore key1_2 【key1 key2】
  88. 将key1和key2操作后的记过保存在key1_2中。
  89. 内部编码两种
  90. intset整数集合:集合中的元素都为整数并且个数小于set-max-instet-entries配置(512个),为了减少使用内存的使用。
  91. hashtable哈希表:集合无法满足intset时,使用hashtable作为内部实现。
  92. 应用场景

  93. 有序集合

你可能感兴趣的:(架构,分布式)