作为基于键值对的NoSQL数据库,Redis支持五种数据类型:字符串(string)类型、哈希(hash)类型、列表(list)类型、集合(set)类型和有序集合(sorted set或zset)类型。
不同的数据类型会有不同的操作命令:
1.针对字符串类型的命令
字符串类型是一种简单的键值对结构,其中键是字符串类型,值可以是字符串、整数或浮点数。Redis的字符串类型可以存储的数据最大长度为512MB。
常用的命令包括:
- 设置字符串的值:
set key value
- 获取字符串的值
get key
- 当key不存在时才能设置值
setNX key value
- 同时设置和获取多个字符串
mset key value [key value] mget key [key] # 注意mset与mget不包含生存时间
- 对值进行增量和减量,注意值需要是数字类型
127.0.0.1:6379> incr visit (integer) 1 127.0.0.1:6379> incrby visit 10 (integer) 11 127.0.0.1:6379> decr visit (integer) 10 127.0.0.1:6379> decrby visit 5 (integer) 5
- 为key值设置新值,会覆盖旧值
getset 001 'zhangsan' getset 001 'lisi' # 这个时候001的值为lisi
2.针对哈希类型的命令
哈希类型是一种内部结构为哈希表的键值对集合。哈希类型的键是一个字符串类型,而值则是由多个域和域值组成的映射表。Redis的哈希类型操作支持添加、获取、删除单个或多个域,也支持获取所有域和域值、获取哈希表中元素的数量等操作。哈希类型可以用于存储对象,如用户信息、商品信息等。哈希类型的优点是可以快速地访问单个域,适合于存储一些有结构化的数据。
常用的命令:
- 设置数据,可以用多个field value对来存储数据,这里field可以理解成对象的属性名,value可以理解成对象的属性值。
hset key field value [field value] 例: 127.0.0.1:6379> hset 001 name 'peter' salary 10000 dep dataTeam (integer) 3
- 读取数据
hget key field 例: 127.0.0.1:6379> hget 001 name "peter" 127.0.0.1:6379> hget 001 salary "10000"
- 后续数据覆盖之前数据,只有当key和field所对应的value不存在时才会设置对应的value,且只能带一组
field value
hsetnx 002 name 'tom'
- 查看该key所对应哈希类型数据的所有field
127.0.0.1:6379> hset 010 name 'mary' salary 8000 (integer) 2 127.0.0.1:6379> hkeys 010 1) "name" 2) "salary" 127.0.0.1:6379> hvals 010 1) "mary" 2) "8000" 127.0.0.1:6379> hgetall 010 1) "name" 2) "mary" 3) "salary" 4) "8000"
- 判断值是否存在
hexists key field
- 哈希中的删除,可删除一个key对应的一个或多个field值
hdel key field [field ...]
3.针对列表类型变量的命令
Redis中的列表类型是一种有序的数据结构,它可以在列表的两端进行添加和删除元素。列表中的每个元素都是一个字符串,而且列表的长度是可以动态变化的。Redis的列表类型提供了丰富的命令,可以对列表进行头部插入、尾部插入、头部删除、尾部删除、按索引插入、按索引删除、获取指定区间的元素等操作。另外,Redis的列表类型还可以用来实现队列和栈等数据结构。
常用的命令:
- 把一个或多个值插入列表的头部,key表示列表,element表示值
lpush key element [element ...]
- 读取列表的值,index代表索引号,从0开始
lindex key index 例: lindex 001 0
- 像列表尾部插入数据,与
lpush
相似
rpush key element [element ...]
- 当key存在时才会向头部或尾部插入数据,不存在不执行
lpushx rpushx
- 获取区间内数据
lrange key start stop 例: 127.0.0.1:6379> rpush 003 'dataTeam' 15000 'Mary' (integer) 3 127.0.0.1:6379> lrange 003 0 1 1) "dataTeam" 2) "15000" 127.0.0.1:6379> lrange 003 0 2 1) "dataTeam" 2) "15000" 3) "Mary"
- 修改列表中元素
lset key index element 例: 127.0.0.1:6379> lindex 003 1 "15000" 127.0.0.1:6379> lset 003 1 18000 OK 127.0.0.1:6379> lindex 003 1 "18000"
- 删除列表头部或尾部的第一个数据
lpop key rpop key
- 删除列表中指定元素
lrem key count element 例: 127.0.0.1:6379> lpush 001 1 1 2 2 1 (integer) 5 127.0.0.1:6379> lrem 001 0 1 (integer) 3
4.针对集合的命令
Redis中的集合是一种无序、唯一的数据结构,它可以存储多个字符串元素,并支持集合间的交集、并集、差集等操作。集合中的元素必须是字符串类型,且元素之间互不相同。
常用的命令:
- 向集合中添加一个或多个元素,集合中无法存储重复数据且无序
sadd key member [member ...]
- 读取集合中所有数据
smembers key
- 判断元素是否存在
sismember key member 例: 127.0.0.1:6379> sismember teamName 'HR' 判断teamName集合中HR元素是否存在
- 交集、并集和差集
# 获得多个key对应的交集 sinter key [key ...] # 获得多个key对应的并集 sunion key [key ...] # 获得多个key对应的差集 sdiff key [key ...] 例: 127.0.0.1:6379> sadd Mike Math English Computer (integer) 3 127.0.0.1:6379> sadd Tom Computer Math Piano (integer) 3 127.0.0.1:6379> sinter Mike Tom 1) "Computer" 2) "Math" 127.0.0.1:6379> sunion Mike Tom 1) "Computer" 2) "Piano" 3) "Math" 4) "English" 127.0.0.1:6379> sdiff Mike Tom 1) "English" 127.0.0.1:6379> sdiff Tom Mike 1) "Piano"
- 删除集合数据
srem key member [member ...]
5.针对有序集合的命令
Redis的有序集合是一种数据结构,它类似于普通的Set,但是每个成员都会关联一个分数(score),用于进行排序。有序集合的主要特点是元素的插入、删除和查找都非常快,时间复杂度都是O(logN)。同时它还支持按照分数范围查找元素,以及按照成员名字的字典序排序。
在有序集合的实现中,Redis使用了一种叫做跳跃表(Skip List)的数据结构。跳跃表是一种随机化的数据结构,它通过在普通链表上增加多级索引来加速查找。跳跃表的插入、删除和查找时间复杂度均为O(logN),与平衡树相当,但是实现起来比平衡树简单,而且性能也非常不错。
总之,有序集合是Redis中非常实用的一个数据结构,它可以用于各种场景,比如排行榜、计数器、社交网络等等。
常用的命令:
- 向有序集合添加元素
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
命令用于向有序集合中添加一个或多个成员,并为每个成员设置一个分数(score)。其中:
key:有序集合的键名。
[NX|XX]:可选参数,当NX表示只有当成员不存在时才执行添加操作,XX则表示只有当成员已经存在时才执行更新操作。
[CH]:可选参数,表示在添加操作时返回有序集合中新增的成员个数。
[INCR]:可选参数,表示在添加操作时将新成员的分数与已存在的成员的分数相加。
score:成员对应的分数,必须是一个浮点数。
member:成员的值,必须是一个字符串。
- 读取key里指定score区间范围内的数据
zrange key start stop [WITHSCORES]
- 更改元素对应的分值
zincrby key increment member
- 获取元素的分值
zscore key member
- 查看有序集合里的元素排名
zrank key member 倒数排名: zrevrank key member
- 删除有序集合里的值
zrem key member [member ...]
- 令删除key所指向的有序集合里排名在start到stop范围的元素,注意第一个元素排名为0
zremrangebyrank key start stop
- 删除key指向的有序队列里score(分值)在min到max范围内的元素
zremrangebyscore key min max