redis数据类型和命令合集

一、redis概述

  • redis默认有16个数据库,0-15,初始默认使用0号库,使用select [编号]修改当前库。如select 6。所有的库都是统一密码验证。
  • dbsize查看当前数据库的key数量
  • flushdb清空当前库
  • flushall清空全部库

redis使用单线程+多了I/O复用的方式工作,多个客户端和同一个服务端交互,提高效率。

官网:

Commands | Redis

help帮助文档的使用:

  • 通过help @generic 命令查看所有通用命令。
  • 通过help @数据类型 命令查看对应数据类型的操作。如help @string
  • 通过help xxx 命令查看某个命令的描述

redis通用命令

  • keys pattern:返回符合条件的key,*表示多个字符,?单个字符
  • exists  key:判断某个key是否存在,返回值为1表示存在,0表示未存在
  • type key:查看你的key是什么类型
  • del key:删除指定的key数据,返回值是删除的数量
  • unlink key:删除指定的key数据,但时是非阻塞的删除,只是先将keys从keyspace元数据中删除,删除value会在后序异步操作
  • expire key time:为指定的key设置过期时间(单位s)
  • ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已过期

二、常用数据类型及操作

1.字符串(string)

string是一个key对应一个value,string类型是二进制安全的。意味着redis的string可以包含任意数据,比如jpg图片或者序列化的对象。

string类型的value最多可以是512M。

string的数据结构为简单动态字符串,可以修改字符串的内容,内部是字节数组形式存储,采用预分配冗余空间的方式减少内存的频繁分配,空间不足会一直扩容,直到512M。

常用命令:

  • set <key> <value>:设置键值对key---value,value是string类型的,多次重复set保存最后一次set的值。
  • get <key>:得到对应key的value
  • append <key> <value>:给key追加数据
  • strlen <key>:获得对应值的长度
  • setnx <key> <value> :只有在key不存在时,设置key的值
  • incr <key> :将key中储存的数字值增1,只能对数字值(整形或浮点型)增1,如果为空,新增值为1
  • decr <key>:将key中储存的数字值减1,只能对数字值减1,如果为空,值为-1
  • incrby/decrby <key> <步长>将key中储存的数字值增/减。自定义步长。
  • mset <key> <value> <key2> <value2> ……:同时设置多个键值对
  • mget <key1> <key2>……:同时取到多个value
  • msetnx <key> <value> <key2> <value2>:同时设置多个,且不存在才会设置,要求全部不存在才能设置成功
  • getrange <key> <起始位置> <结束位置>:获取值的范围,类似substring
  • setrange <key> <起始位置> <value>:从某个位置开始复写值
  • setex <key> <过期时间> <value>:设置键的同时,设置过期时间,单位秒,ex=expire
  • getset <key> <value>:获取到旧值,并且设置新值

补充:

set命令的完整形式如下,可以同时设置过期时间或加上NX(Not Exist)选项,非常有用,也就是可以将set、expire、setnx命令结合起来,作为原子操作,非常有用。

set key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]

redis中的单个命令都是原子操作,因为都是单线程操作,不会出现线程安全问题。

key的命令最好以 项目名:服务名:操作名:编号 的方式命名,以冒号分隔,约定俗成。

2.列表(List)

一个键对应一个列表,即有多个值。列表中按照插入的顺序进行存放,可以添加一个元素到列表的头部或者尾部。

命令:

  • lpush/rpush <key> <value1> <value2> <value3> ……:从左边/右边插入一个或多个值
  • lpop/rpop <key>:从左/右弹出一个值,值被弹完了,该键也就会消失
  • brpop/blpop <key> <timeout>:阻塞式的获取,最多等待多少s
  • rpoplpush <key1> <key2> :从key1列表右边弹出一个值插入到key2的左边
  • lrange <key> <start> <stop>:按照索引下标获得元素(从左到右),start下标从0开始,stop为-1表示取后面的所有值
  • lindex <key> <index>:按照下标获得元素,从左到右
  • llen <key> :获得列表长度
  • linsert <key> before <value> <newvalue> :在value的后面插入newvalue
  • lrem <key> <n> <value>:从左删除n个value,不等于value的会跳过,寻找下一个是否为value
  • Iset <key> <index> <value>:将列表key下标为index的值替换为value

根据不同的出入口,可以利用list来实现栈、队列。

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

再具体点其实就是一个快速链表quickList,首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist。

因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。 

 Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

3.集合(set)

set和list类似,但是set可以去重,且内部元素是无序的,底层和java一样就是一个value为null的hash表,添加删除查找的复杂度都是O(1)。额外的redis中的set还支持交集、并集、差集等功能。

命令:

  • sadd <key> <value1> <value2> ……:添加值到集合key中,如果值已经存在则忽略
  • srem <key> <value1> <value2>……:删除集合中的某个元素
  • smembers <key> :取出集合的所有值
  • sismembers <key> <value>:判断集合是否有该value值,有则为1,否则为0
  • scard <key>:返回元素个数
  • spop <key> [n]:随机弹出n个值,从集合中删除,不写n就是删除1个
  • srandmember <key> [n]:随机取出n个值,但是不会从集合中删除
  • smove <source> <destination> <value>:把集合中的一个值移到另一个集合
  • sinter <key1> <key2>:返回两个集合的交集元素
  • sunion <key1> <key2>:返回两个集合的并集元素
  • sdiff <key1> <key2>:返回两个集合的差集元素(key1中有,但是key2中无)

4.哈希(Hash)

hash是一个键值对的集合,类似Map<String,Map<String,String>>,适合存储对象。

命令:

  • hset <key> <field> <value>:给key集合中的field赋值value
  • hget <key> <field>:从key中取field的值
  • hmset <key> <field1> <value1> <field2> <value2> :批量设置hash值
  • hexists <key> <field>:查看看hash表中对应field的值是否存在
  • hkeys <key>:列出该hash集合中的所有field
  • hvals <key>:列出所有的value值
  • hgetall <key>:获取所有的key和value
  • hincrby <key> <field> <n>:为对应field的值自增n
  • hsetnx <key> <field> <value>:当且仅当field的值没有时才设置value

Hash类型对应的数据结构是两种: ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
 

5.有序集合(Zset)

和set唯一的区别就是每个成员都关联了一个score,score用于从低到高的顺序排序集合中的元素。score可以重复。

因为元素是有序的,所以你也可以很快的根据评分( score )或者次序( position )来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
命令:

  • zadd <key>  [GT|LT]  <score1> <value1> <score2> <value2>……:将一个或多个member元素及其score值加入到有序集key当中,默认升序排序
  • zscore <key> <value>:获取指定元素的score,可以用于判断是否存在某元素
  • zrange <key> <start> <stop> [withscores]:返回有序集中下标start-stop之间的元素,stop为-1表示所有
  • zrevrange <key> <start> <stop> [withscores]:倒序返回start-stop的排名
  • zrangebyscore <key> <start> <end> [withscores]:通过socre显示对应区间的元素,升序排序
  • zrevrangebyscore <key> max min:改为降序排序
  • zincrby <key> <n> <value>:为元素的score加上n
  • zrem <key> <value>:删除指定value的元素
  • zrank <key> <value>:返回该值在集合中的排名,从0开始
  • zcount <key> <min> <max>:统计该集合中的元素个数
  • zdiff、zinter、zunion

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

底层实现是一个跳跃表加hash表:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值