java开发技术之Redis类型技能入门篇
字符串
首先Redis数据存储都会以key value 的形式进行存放, 所有的key都是字符串类型。此处所说的类型特指的是value中存放的类型。下文所讲的hash、列表都是基于value上进行讲解的。Redis会根据传入字符串类型规则进行判断,java培训并采取相应的内部编码进行存储。数值型会采用8个字节的长整型进行编码存储,小于等于39个字节的字符串采用emstr编码存储,大于39字节的字符串采用raw编码存储。如果需要查看该键对应值的存储类型可运行object encoding k1命令。
常用写命令
( ) ( )
常用读命令
1// 1. 获取键 k1 的 值2get k1 3// 2. 批量获取 k1,k2,k3 的值4mget k1 k2 k3 k4
注意:key一般我们都会采用业务名:对象名:属性名的方式进行命名。
哈希
哈希类型在Redis中value是以{{key,value},{key,value}}的形式存储,我们通过字符和哈希类型的存储模型图来更直观的认识它们两者之间的关系,如图1-1
图1-1
Redis对于哈希类型的存储会根据哈希类型个数(对应图中的field个数)采取不同编码进行存储。如果哈希类型个数小于hash-max-ziplist-entries(默认512个)且所有值的(对应图中的value)存储大小都小于hash-max-ziplist-value(默认64字节)那么会使用更加紧凑的ziplist编码进行存储。
当无法满足ziplist条件的时候会采用hashtable编码方式进行存储。因为在节省内存方面ziplist比hashtable更优秀,但如果数据量上来后检索效率不及hashtable。
常用写命令
:: :: :: ::
常用读命令
:: :: :: :: ::
列表
Redis中列表类型的存储模型如图1-2:
图1-2
列表类型中value最多的存储元素为2^32-1个,可重复。value元素的内部编码根据元素个数和大小会采取ziplist和linkedlist两种编码方式进行存储。当value元素个数小于list-max-ziplist-entries(默认512),同时value中每个元素的大小小于list-max-ziplist-value(64字节)会采取ziplist进行编码。
当无法满足ziplist的条件会采取linkedlist编码。ziplist编码对数据进行压缩以减少内存,而linkedlist采用链表的数据结构来存储数据。据说Redis3.2 版本之后提供了一个更合理的内部编码 quicklist,它结合ziplist和linkedlist两者的优势。
常用写命令
为了行文方便 对于从左往右我们用此图标进行标记:➡️, 从右往左用此图标标记⬅️,列表都特指user:1:message
:: :: :: :: :: :: :: :: :: :: ::
常用读命令
:: :: :: ::
应用场景
通过lpush + brpop 命令 实现消息队列。
每个用户都有属于自己的文章列表,需要分页显示各个用户的文章列表。
集合
集合类型的元素是可以重复的,如图1-3为集合类型的存储模型图:
图1-3
集合类型的内部编码有两种:
intset, 当集合类型为整数且数量小于set-max-inset-entries(默认512),会采取该编码方式
当无法满足intset编码的条件会采取hashtable
常用的写命令
: : : : : : : : :
常用的读命令
: : : : : : : : : : :
注意:当集合的元素过多的时候,使用smembers命令会有损性能,建议使用sscan命令来完成。
有序集合
有序集合类型的存储模型如图1-4:
图1-4
它可以类比集合类型和哈希类型的组合,其中value中包含两个主要的字段score和member,member中元素的值不能够重复,而score中元素的类型为整型值能够重复。通过score中元素的值我们能够对member中的元素进行排序。
内部也采用了两种编码:
ziplist (压缩列表)
skiplist (跳跃表)
写操作命令
1// 1. 添加集合成员 ,(85 、 zmj) 2zadd users 85 zmj 3// 2. 添加集合成员 ,存在才能设置成功 4zadd users XX 87 zhangmoujiang 5// 3. 添加集合成员,不存在才能设置成功 6zadd users NX 87 zhangmoujiang 7// 4. 删除集合内成员 caonimei 8zrem users caonimei 9// 5. 给成员xunini增加 1分,如果没有成员会自动添加10zincrby users 1 xuxnini
读操作命令
[] []
几个管理键的常用命令
1//1. 当前数据库的键数量 2dbsize 3//2. 随机返回当前数据的一个键 4randomkey 5//3. 设置键key1 20 秒过期,如果键不存在返回结果为0。某个键设置了过期时间,然后执行了set命令,那么该键的过期时间会被清除。 6expire key1 20 7//4. 查看key1键还剩几秒过去,返回数字的单位为秒。返回-2 表示已过期 8ttl key1 9//5. 移除键key1的过期时间10persisit key1 11//6. 获取所有键,keys后面可接类正则的表达式来匹配键的名称12keys * 13//7. 选择0号数据库,redis中默认有16个数据库 ,编号从0开始...14select 015//8. 清除当前数据库数据16flushdb17//9. 清除所有数据库数据18flushall