Redis03:Redis的5大常用数据类型

1、常用五大数据类型

redis常见数据类型操作命令地址:http://www.redis.cn/commands.html

1.1、Redis 的key的操作命令

1.1.1 keys
语法:keys pattern
作用:查找所有符合模式pattern的key.  pattern可以使用通配符。

通配符:

  • *:表示0或多个字符,例如:keys * 查询所有的key。

  • ?:表示单个字符,例如:wo?d , 匹配 word , wood

  • [] :表示选择[]内的一个字符,例如wo[or]d, 匹配word, wood, 不匹配wold、woord

1.1.2 exists
语法:exists key [key…]
作用:判断key是否存在
返回值:整数,存在key返回1,其他返回0。使用多个key,返回存在的key的数量。

1.1.3 type
语法:type key
作用:查看key所存储值的数据类型
返回值:字符串表示的数据类型
- none (key不存在)
- string (字符串)
- list (列表)
- set (集合)
- zset (有序集)
- hash (哈希表)

1.1.4 del
语法:del key [key…]
作用:删除存在的key,不存在的key忽略。
返回值:数字,删除的key的数量。

unlink key : 根据value选择非阻塞删除

仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。

1.1.5 move
语法:move key db
作用:移动key到指定的数据库,移动的key在原库被删除。
返回值:移动成功返回1,失败返回0.

1.1.6 expire
语法:expire key seconds
作用:设置key的生存时间,超过时间,key自动删除。单位是秒。
返回值:设置成功返回数字 1,其他情况是 0

1.1.7 ttl
语法:ttl key
作用:查看key的剩余生存时间(ttl: time to live),以秒为单位。
返回值:
- -1 :没有设置key的生存时间, key永不过期。
- -2:key不存在

1.1.8 rename
语法:rename key newkey
作用:将key改为名newkey。当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
当 newkey 已经存在时, RENAME 命令将覆盖旧值。

1.2 字符串类型(String)

  • 字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON化的对象甚至是一张图片。
  • 字符串类型的数据操作总的思想是通过key操作value,key是数据标识,value是我们感兴趣的业务数据。
(1)set
语法:set key value
功能:将字符串值 value 设置到 key 中,如果key已存在,后放的值会把前放的值覆盖掉。
返回值:OK表示成功

(2)get
语法:get key
功能:获取 key 中设置的字符串值
返回值:key存在,返回key对应的value;
		key不存在,返回nil

(3)append
语法:append key value
功能:如果 key 存在,则将 value 追加到 key 原来旧值的末尾
	  如果 key 不存在,则将key 设置值为 value
返回值:追加字符串之后的总长度(字符个数)

(4)strlen
语法:strlen key
功能:返回 key 所储存的字符串值的长度
返回值:如果key存在,返回字符串值的长度;
		key不存在,返回0

(5)incr
语法:incr key
功能:将 key 中储存的数字值加1,如果 key 不存在,则 key 的值先被初始化为 0 再执行incr操作。
返回值:返回加1后的key值

(6)decr
语法:decr key
功能:将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执行 decr 操作。
返回值:返回减1后的key值

(7)incrby
语法:incrby key offset
功能:将 key 所储存的值加上增量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行 INCRBY 命令。
返回值:返回增量之后的key值。

(8)decrby
语法:decrby key offset
功能:将 key 所储存的值减去减量值,如果 key 不存在,则 key 的值先被初始化为 0 再执行 DECRBY 命令。
返回值:返回减量之后的key值。

(9)getrange
语法:getrange key startIndex endIndex
功能:获取 key 中字符串值从 startIndex 开始到 endIndex 结束的子字符串,包括startIndex和endIndex, 负数表示从字符串的末尾开始,-1 表示最后一个字符。

(10)setrange
语法:setrange key offsetIndex value
功能:用value覆盖key的存储的值从offsetIndex开始。
返回值:修改后的字符串的长度。

(11)setex
语法:setex key seconds value
功能:设置key的值,并将 key 的生存时间设为 seconds (以秒为单位)  ,如果key已经存在,将覆盖旧值。
返回值:设置成功,返回OK。

(12)setnx
语法:setnx key value
功能:setnx 是 set if not exists 的简写,如果key不存在,则 set 值,存在则不设置值。(不存在则设置:分布式锁常用)
返回值:设置成功,返回1
设置失败,返回0

(13)mset
语法:mset key value [key value…]
功能:同时设置一个或多个 key-value 对
返回值:设置成功,返回OK

(14)mget
语法:mget key [key …]
功能:获取所有(一个或多个)给定 key 的值
返回值:包含所有key的列表,如果key不存在,则返回nil

(15)msetnx
语法:msetnx key value[key value…]
功能:同时设置一个或多个 key-value 对,如果有一个key是存在的,则设置不成功。
返回值:设置成功,返回1
设置失败,返回0

这里主要得益于其原子性,一个失败则都失败

原子性:所谓原子操作是指不会被线程调度机制打断的操作;

这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

(1)在单线程中, 能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间。

(2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

Redis单命令的原子性主要得益于Redis的单线程。

(16)getset
语法:getset <key> <value>
作用:以新换旧,设置了新值同时获得旧值。(先get再set)

(17)创建对象
语法1:set 对象名:id号 {属性名:属性值,属性名:属性值,……}
语法2:mset 对象名:id号:属性名 属性值 对象名:id号:属性名 属性值 ……

1.3 列表(List)

Redis 列表是简单的字符串列表,按照插入顺序排序,左边(头部)、右边(尾部)或者中间都可以添加元素。

其底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

(1)lpush
语法:lpush key value [value…]
功能:将一个或多个值 value 插入到列表 key 的最左边(表头),各个value值依次插入到表头位置。
返回值:插入之后的列表的长度。

(2)rpush
语法:rpush key value [value…]
功能:将一个或多个值 value 插入到列表 key 的最右边(表尾),各个 value 值按依次插入到表尾。
返回值:插入之后的列表的长度。

(3)lrange
语法:lrange key startIndex endIndex
功能:获取列表 key 中指定下标区间内的元素,下标从0开始,到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。
返回值:获取到的元素列表。

(4)lpop
语法:lpop key
功能:移除并返回列表key头部第一个元素,即列表左侧的第一个元素。
返回值:列表左侧第一个元素的值;列表key不存在,返回nil。

(5)rpop
语法:rpop key
功能:移除并返回列表key尾部第一个元素,即列表右侧的第一个元素。
返回值:列表右侧第一个元素的值;列表key不存在,返回nil。

(6)lindex
语法:lindex key index
功能:获取列表 key 中下标为指定 index 的元素,列表元素不删除,只是查询。0 表示列表的第一个元素,1 表示列表的第二个元素;index也可以负数的下标, -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
返回值:key存在时,返回指定元素的值;
	Key不存在时,返回nil。

(7)llen
语法:llen key
功能:获取列表 key 的长度
返回值:数值,列表的长度;key不存在返回0

(8)lrem
语法:lrem key count value
功能:根据参数 count 的值,移除列表中与参数 value 相等的元素,
	count >0 ,从列表的左侧向右开始移除;
	count < 0 从列表的尾部开始移除;
	count = 0移除表中所有与 value 相等的值。
返回值:数值,移除的元素个数

(9)ltrim
语法:ltrim key startIndex endIndex
功能:截取key的指定下标区间的元素,并且赋值给key。下标从0开始,一直到列表长度-1;下标也可以是负数,表示列表从后往前取,-1表示倒数第一个元素,-2表示倒数第二个元素,以此类推;startIndex和endIndex超出范围不会报错。
返回值:执行成功返回ok

(10)lset
语法:lset key index value
功能:将列表 key 下标为 index 的元素的值设置为 value。
功能:设置成功返回ok ; key不存在或者index超出范围返回错误信息。

(11)linsert
语法:linsert key before/after pivot value
功能:将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key不存在或者pivot不在列表中,不执行任何操作。
返回值:命令执行成功,返回新列表的长度。没有找到pivot返回 -1, key不存在返回0。

1.4 集合(Set)

set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Set是string类型的无序集合。通过key确定集合,key是集合标识,元素没有下标,只有直接操作业务数据和数据的个数。

(1)sadd
语法:sadd key member [member…]
功能:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略,不会再加入。
返回值:加入到集合的新元素的个数(不包括被忽略的元素)

(2)smembers
语法:smembers key
功能:获取集合 key 中的所有成员元素,不存在的key视为空集合。
返回值:返回指定集合的所有元素集合,不存在的key,返回空集合。

(3)sismember
语法:sismember key member
功能:判断 member 元素是否是集合 key 的元素
返回值:member是集合成员返回1,其他返回 0

(4)scard
语法:scard key
功能:获取集合里面的元素个数
返回值:数字,key的元素个数。其他情况返回 0

(5)srem
语法:srem key member [member…]
功能:移除集合中一个或多个元素,不存在的元素被忽略。
返回值:数字,成功移除的元素个数,不包括被忽略的元素。

(6)srandmember
语法:srandmember key[count]
功能:只提供key,随机返回集合中一个元素,元素不删除,依然在集合中;
	  提供了count时,count 正数, 返回包含count个数元素的集合,集合元素各不重复。count是负数,返回一个count绝对值的长度的集合,集合中元素可能会重复多次。
返回值:一个元素或者多个元素的集合

(7)spop
语法:spop key[count]
功能:随机从集合中删除一个或count个元素。
返回值:被删除的元素,key不存在或空集合返回nil。

(8)smove
语法:smove src dest member
功能:将 member 元素从src集合移动到dest集合,member不存在,smove不执行操作,返回0,如果dest存在member,则仅从src中删除member。
返回值:成功返回 1 ,其他返回 0

(9)sdiff
语法:sdiff key key [key…]
功能:返回指定集合的差集,以第一个集合为准进行比较,即第一个集合中有但在其它任何集合中都没有的元素组成的集合。
返回值:返回第一个集合中有而后边集合中都没有的元素组成的集合,如果第一个集合中的元素在后边集合中都有则返回空集合。

(10)sinter
语法:sinter key key [key…]
功能:返回指定集合的交集,即指定的所有集合中都有的元素组成的集合。
返回值:交集元素组成的集合,如果没有则返回空集合。

(11)sunion
语法:sunion key key [key…]
功能:返回指定集合的并集,即指定的所有集合元素组成的大集合,如果元素有重复,则保留一个。
返回值:返回所有集合元素组成的大集合,如果所有key都不存在,返回空集合。

应用场景:

微博,A用户将所有关注的人放在一个set集合中,将其粉丝也放在一个集合中!共同关注、共同好友(交集),二度好友,推荐好友等等

1.5 哈希(Hash)

Redis的hash 是一个string类型的key和value的映射表,这里的value是一系列的键值对,hash特别适合用于存储对象。类似Java里面的Map<String,Object>

用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储

主要有以下2种存储方式:

每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大。用户ID数据冗余

通过key(用户ID) + field(属性标签)就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

(1)hset
语法:hset  key  field  value  [field  value …]
功能:将键值对field-value设置到哈希列表key中,如果key不存在,则新建哈希列表,然后执行赋值,如果key下的field已经存在,则value值覆盖。
返回值:返回设置成功的键值对个数。

(2)hget
语法:hget key field
功能:获取哈希表 key 中给定域 field 的值。
返回值:field域的值,如果key不存在或者field不存在返回nil。

(3)hmset
语法:hmset key  field value [field value…]
功能:同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的field,hash表key不存在,创建空的hash表,再执行hmset.
返回值:设置成功返回ok,如果失败返回一个错误。

(4)hmget
语法:hmget key field [field…]
功能:获取哈希表 key 中一个或多个给定域的值
返回值:返回和field顺序对应的值,如果field不存在,返回nil。

(5)hgetall
语法:hgetall key
功能:获取哈希表 key 中所有的域和值
返回值:以列表形式返回hash中域和域的值,key不存在,返回空hash.

(6)hdel
语法:hdel key field [field…]
功能:删除哈希表 key 中的一个或多个指定域field,不存在field直接忽略。
返回值:成功删除的field的数量。

(7)hlen
语法:hlen key
功能:获取哈希表 key 中域field的个数
返回值:数值,field的个数。key不存在返回0.

(8)hexists
语法:hexists key field
功能:查看哈希表 key 中,给定域 field 是否存在
返回值:如果field存在,返回1,其他返回0。

(9)hkeys
语法:hkeys key
功能:查看哈希表 key 中的所有field域列表
返回值:包含所有field的列表,key不存在返回空列表

(10)hvals
语法:hvals key
功能:返回哈希表 中所有域的值列表
返回值:包含哈希表所有域值的列表,key不存在返回空列表。

(11)hincrby
语法:hincrby key field int
功能:给哈希表key中的field域增加int
返回值:返回增加之后的field域的值

(12)hincrbyfloat
语法:hincrbyfloat key field float
功能:给哈希表key中的field域增加float
返回值:返回增加之后的field域的值

(13)hsetnx
语法:hsetnx key field value
功能:将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才设置,否则不设置。
返回值:设值成功返回1,其他返回0.

1.6 有序集合(Zset)

Redis 有序集合zset和集合set一样也是string类型元素的集合,且不允许重复的成员。

不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。

redis通过分数来为集合中的成员进行从小到大的排序。

底层原理

有序集合Zset是一个很特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。

数据结构

(1)hash表:hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

(2)跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

那什么是跳跃表

​ 有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。

实例:对比有序链表和跳跃表,从链表中查询出51

(1)有序链表

  • 要查找值为51的元素,需要从第一个元素开始依次查找、比较才能找到。共需要6次比较。

(2)跳跃表

  • 从第2层开始,1节点比51节点小,向后比较。21节点比51节点小,继续向后比较,后面就是NULL了,所以从21节点向下到第1层

  • 在第1层,41节点比51节点小,继续向后,61节点比51节点大,所以从41向下

  • 在第0层,51节点为要查找的节点,节点被找到,共查找4次。

  • 从此可以看出跳跃表比有序链表效率要高

(1)zadd
语法:zadd key score member [score member…] 
功能:将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果member存在集合中,则覆盖原来的值;score可以是整数或浮点数.
返回值:数字,新添加的元素个数.

(2)zrange
语法:zrange key startIndex endIndex [WITHSCORES]
功能:查询有序集合,指定区间的内的元素。集合成员按score值从小到大来排序;
startIndex和endIndex都是从0开始表示第一个元素,1表示第二个元素,
以此类推; startIndex和endIndex都可以取负数,表示从后往前取,
-1表示倒数第一个元素;WITHSCORES选项让score和value一同返回。
返回值:指定区间的成员组成的集合。

(3)zrangebyscore
语法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
功能:获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括min和max)的成员,有序成员是按递增(从小到大)排序;
	  使用符号”(“ 表示包括min但不包括max;
	  withscores 显示score和 value;
      limit用来限制返回结果的数量和区间,在结果集中从第offset个开始,取count个。
返回值:指定区间的集合数据

(4)zrem
语法:zrem key member [member…]
功能:删除有序集合 key 中的一个或多个成员,不存在的成员被忽略。
返回值:被成功删除的成员数量,不包括被忽略的成员。

(5)zcard
语法:zcard key
作用:获取有序集 key 的元素成员的个数。
返回值:key存在,返回集合元素的个数; key不存在,返回0。

(6)zcount
语法:zcount key min max
功能:返回有序集 key 中, score 值在 min 和 max 之间(包括 score 值等于 min 或 max )的成员的数量。
返回值:指定有序集合中分数在指定区间内的元素数量。

(7)zrank
语法:zrank key member
功能:获取有序集 key 中成员 member 的排名,有序集成员按 score 值从小到大顺序排列,
	从0开始排名,score最小的是0 。
返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil。

(8)zscore
语法:zscore key member
功能:获取有序集合key中元素member的分数。
返回值:返回指定有序集合元素的分数。

(9)zrevrank
语法:zrevrank key member
功能:获取有序集 key 中成员 member 的排名,有序集成员按 score 值从大到小顺序排列,
	从0开始排名,score最大的是0 。
返回值:指定元素在有序集合中的排名;如果指定元素不存在,返回nil。

(10)zrevrange
语法:zrevrange key startIndex endIndex [WITHSCORES]
功能:查询有序集合,指定区间的内的元素。集合成员按score值从大到小来排序;
	startIndex和endIndex都是从0开始表示第一个元素,1表示第二个元素,
	以此类推; startIndex和endIndex都可以取负数,表示从后往前取,
	-1表示倒数第一个元素;WITHSCORES选项让score和value一同返回。
返回值:指定区间的成员组成的集合。

(11)zrevrangebyscore
语法:zrevrangebyscore key max min  [WITHSCORES ] [LIMIT offset count]
功能:获取有序集 key 中,所有 score 值介于 max 和 min 之间(包括max和min)的成员,有序成员是按递减(从大到小)排序;
	  使用符号”(“ 表示不包括min和max;
	  withscores 显示score和 value;
      limit用来限制返回结果的数量和区间,在结果集中从第offset个开始,取count个。
返回值:指定区间的集合数据

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@烟雨倾城ゝ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值