Redis 数据类型
Redis中存储数据是通过key-value格式存储数据的,其中value可以定义五种数据类型:
- String(字符类型)
- Hash(散列类型)
- List(列表类型)
- Set(集合类型)
- SortedSet(有序集合类型,简称zset)
注意:在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。
1 String类型
赋值
语法:SET key value
127.0.0.1:6379> set k1 v1OK
取值
语法:GET key
127.0.0.1:6379> get k1"v1"
取值并赋值
语法:GETSET key value
127.0.0.1:6379> getset k1 v2"v1"127.0.0.1:6379> get k1"v2"
数值增减
注意事项:
- 当value为整数数据时,才能使用以下命令操作数值的增减。
- 数值递增都是原子操作。
递增数字
语法:INCR key
127.0.0.1:6379> incr num(integer) 1127.0.0.1:6379> incr num(integer) 2127.0.0.1:6379> incr num(integer) 3
增加指定的整数
语法:INCRBY key increment
127.0.0.1:6379> incrby num 2(integer) 5127.0.0.1:6379> incrby num 2(integer) 7127.0.0.1:6379> incrby num 2(integer) 9
递减数值
语法:DECR key
127.0.0.1:6379> decr num(integer) 9127.0.0.1:6379> decr num(integer) 8
减少指定的整数
语法:DECRBY key decrement
127.0.0.1:6379> decr num(integer) 6127.0.0.1:6379> decr num(integer) 5127.0.0.1:6379> decrby num 3(integer) 2127.0.0.1:6379> decrby num 3(integer) -1
仅当不存在时赋值
该命令用来实现分布式锁,以后的专题会专门讲解分布式锁的实现。
语法:setnx key value
redis> EXISTS k1 # k1 不存在(integer) 0redis> SETNX k1 "v1" # k1设置成功(integer) 1redis> SETNX k1 "v2" # 尝试覆盖 k1,失败(integer) 0redis> GET k1 # 没有被覆盖"v1"
其它命令
向尾部追加值
APPEND命令,向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
语法:APPEND key value
127.0.0.1:6379> set str helloOK127.0.0.1:6379> append str " world!"(integer) 12127.0.0.1:6379> get str "hello world!"
获取字符串长度
STRLEN命令,返回键值的长度,如果键不存在则返回0。
语法:STRLEN key
127.0.0.1:6379> strlen str (integer) 0127.0.0.1:6379> set str helloOK127.0.0.1:6379> strlen str (integer) 5
同时设置/获取多个键值
语法:
- MSET key value [key value …]
- MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3OK127.0.0.1:6379> get k1"v1"127.0.0.1:6379> mget k1 k31) "v1"2) "v3"
应用场景之自增主键
- 需求:商品编号、订单号采用INCR命令生成。
- 设计:key命名要有一定的设计
- 实现:定义商品编号key:items:id
192.168.101.3:7003> INCR items:id(integer) 2192.168.101.3:7003> INCR items:id(integer) 3
Hash类型
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
赋值
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时0。
一次只能设置一个字段值
语法:HSET key field value
127.0.0.1:6379> hset user username zhangsan (integer) 1
一次可以设置多个字段值
语法:HMSET key field value [field value ...]
127.0.0.1:6379> hmset user age 20 username lisi OK
语法:HSETNX key field value
当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作
127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作(integer) 0
取值
一次只能获取一个字段值
语法:HGET key field
127.0.0.1:6379> hget user username"zhangsan“
一次可以获取多个字段值
语法:HMGET key field [field ...]
127.0.0.1:6379> hmget user age username1) "20"2) "lisi"
获取所有字段值
语法:HGETALL key
127.0.0.1:6379> hgetall user1) "age"2) "20"3) "username"4) "lisi"
删除字段
可以删除一个或多个字段,返回值是被删除的字段个数
语法:HDEL key field [field ...]
127.0.0.1:6379> hdel user age(integer) 1127.0.0.1:6379> hdel user age name(integer) 0127.0.0.1:6379> hdel user age username(integer) 1
增加数字
语法:HINCRBY key field increment
127.0.0.1:6379> hincrby user age 2 将用户的年龄加2(integer) 22127.0.0.1:6379> hget user age 获取用户的年龄"22"
其它命令
判断字段是否存在
语法:HEXISTS key field
127.0.0.1:6379> hexists user age 查看user中是否有age字段(integer) 1127.0.0.1:6379> hexists user name 查看user中是否有name字段(integer) 0
只获取字段名或字段值
语法:
- HKEYS key
- HVALS key
127.0.0.1:6379> hmset user age 20 name lisi OK127.0.0.1:6379> hkeys user1) "age"2) "name"127.0.0.1:6379> hvals user1) "20"2) "lisi"
获取字段数量
语法:HLEN key
127.0.0.1:6379> hlen user(integer) 2
获取所有字段
作用:获得hash的所有信息,包括key和value
语法:hgetall key
应用之存储商品信息
注意事项:存储那些对象数据,特别是对象属性经常发生增删改操作的数据。
商品信息字段
【商品id、商品名称、商品描述、商品库存、商品好评】
定义商品信息的key
商品ID为1001的信息在 Redis中的key为:[items:1001]
存储商品信息
192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9OK
获取商品信息
192.168.101.3:7003> HGET items:1001 id"3"192.168.101.3:7003> HGETALL items:10011) "id"2) "3"3) "name"4) "apple"5) "price"6) "999.9"
3 List类型
Redis的列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
命令
向列表两端增加元素
向列表左边增加元素
语法:LPUSH key value [value ...]
127.0.0.1:6379> lpush list:1 1 2 3(integer) 3
向列表右边增加元素
语法:RPUSH key value [value ...]
127.0.0.1:6379> rpush list:1 4 5 6(integer) 3
查看列表
语法:LRANGE key start stop
LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
127.0.0.1:6379> lrange list:1 0 21) "2"2) "1"3) "4"
从列表两端弹出元素
LPOP命令从列表左边弹出一个元素,会分两步完成:
- 第一步是将列表左边的元素从列表中移除
- 第二步是返回被移除的元素值。
语法:
LPOP key
RPOP key
127.0.0.1:6379> lpop list:1"3"127.0.0.1:6379> rpop list:1"6"
获取列表中元素的个数
语法:LLEN key
127.0.0.1:6379> llen list:1(integer) 2
其它命令
删除列表中指定个数的值
LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:
l 当count>0时, LREM会从列表左边开始删除。
l 当count<0时, LREM会从列表后边开始删除。
l 当count=0时, LREM删除所有值为value的元素。
语法:LREM key count value
获得/设置指定索引的元素值
获得指定索引的元素值
语法:LINDEX key index
127.0.0.1:6379> lindex l:list 2"1"
设置指定索引的元素值
语法:LSET key index value
127.0.0.1:6379> lset l:list 2 2OK127.0.0.1:6379> lrange l:list 0 -11) "6"2) "5"3) "2"4) "2"
只保留列表指定片段, 指定范围和LRANGE一致
语法:LTRIM key start stop
127.0.0.1:6379> lrange l:list 0 -11) "6"2) "5"3) "0"4) "2"127.0.0.1:6379> ltrim l:list 0 2OK127.0.0.1:6379> lrange l:list 0 -11) "6"2) "5"3) "0"
向列表中插入元素
该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
语法:LINSERT key BEFORE|AFTER pivot value
127.0.0.1:6379> lrange list 0 -11) "3"2) "2"3) "1"127.0.0.1:6379> linsert list after 3 4(integer) 4127.0.0.1:6379> lrange list 0 -11) "3"2) "4"3) "2"4) "1"
将元素从一个列表转移到另一个列表中
语法:RPOPLPUSH source destination
127.0.0.1:6379> rpoplpush list newlist "1"127.0.0.1:6379> lrange newlist 0 -11) "1"127.0.0.1:6379> lrange list 0 -11) "3"2) "4"3) "2"
应用之商品评论列表
l 需求1:用户针对某一商品发布评论,一个商品会被不同的用户进行评论,存储商品评论时,要按时间顺序排序。
l 需求2:用户在前端页面查询该商品的评论,需要安装时间顺序降序排序。
思路:
使用list存储商品评论信息,KEY是该商品的ID,VALUE是商品评论信息列表商品编号为1001的商品评论key【items: comment:1001】
192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不错,很好!!