¶概述
redis的几种数据类型:STRING SET HASH LIST
redis的命令行操作模式会显示他的语法提示,基本使用采用的是k/v值的形式,即通过key设置value的方式。
对redis数据库的操作可分为两种方式,第一种采用redis-cli进行访问,第二种采用编程语言,如 Python、Java等。本文中使用 redis-cli 的方式进行数据的访问,首先需要启动redis,连接上 redis-server,这在上节已经进行了详细的讲解,此处不再赘述。
redis-cli 在使用时提供了命令提示,方便我们操作。
Redis 命令参考
¶使用redis-cli对redis进行字符串string操作
¶添加
set key value
,value 为string类型,可以不使用引号
示例:
1 | $ 127.0.0.1:6379> set username tmj |
将字符串值 value 关联到 key ,如果 key 已经持有其他值,set 命令就覆写旧值,无视其类型。并且默认的过期时间是永久(即使之前的 key 快过期了),即永久不会过期。
¶批量添加
mset key1 value1 key2 value2 ... ...
¶删除
del key
示例:
1 | $ 127.0.0.1:6379> del username |
¶设置过期时间
expire key timeout
时间单位为秒
示例:
1 | $ 127.0.0.1:6379> expire username 60 |
可以对已经设置过过期时间的 key 重新设置过期时间,将覆盖原值。也可以在设置 key 时,同时指定过期时间,使用 EX
参数
1 | $ 127.0.0.1:6379> set age 18 EX 800 |
等价方式,使用 setex key timeout value
:
1 | $ 127.0.0.1:6379> setex age 800 18 |
注意:
expire key timeout
指令是通用的,适用于各种类型的key,下面的两中方式只适用于string类型。
¶查看过期时间
ttl key
过期时间的查询结果有一下几种:
- 大于0的正整数:此key存在,且还剩下正整数的时间过期
- -1 : 此key存在,且没有设置过期时间,即永久不会过期
- -2 : 此key不存在,或存在但是过期了,总之就是现在不存在了。
示例:
1 | $ 127.0.0.1:6379> ttl username |
¶查看某个string类型key的值
get key
¶批量查看多个string类型key的值
mget key1 key2 key3 ...
¶查看当前redis中所有类型的key
keys *
¶查看key的类型
因为redis中所有类型的key是存在一起的,但是每中类型的key的查看的方式都是不同的,一旦使用的查询命令不对就会报错,此时可以使用 type key
查看key的类型
示例:
1 | $ 127.0.0.1:6379> type username |
¶使用redis-cli对redis进行列表list操作
Redis列表 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
¶添加
添加到头部(左边)使用 lpush key value
,添加到尾部(右边)使用 rpush key value
。如果key不存在,一个空的列表会被创建并执行lpush(rpush)操作,当key存在,但不是列表类型时,返回错误。
示例:
1 | $ 127.0.0.1:6379> lpush language python |
列表中可以添加多个值,且可以是重复值
1 | $ 127.0.0.1:6379> lpush language python python |
注意:当一次添加多个 value 的时候,最后一个 value 是第一个被添加的,如上面的例子中,最后一个 python 是第一被添加的。
¶查看列表中的的元素(是一个区间中的元素)
lrange key start stop
,指令中的 l 代表的是列表list的意思,返回列表key中指定区间内的元素,区间以偏移量start和stop指定,如果要左边的第一个到最后的一个 lrange key 0 -1
(列表的第一项下标是 0,左后一项为 -1)。若只想查看某个值,则start 和 stop 指定一样的下标即可。
示例:
1 | $ 127.0.0.1:6379> lrange language 0 -1 |
¶返回指定下标的元素
使用 lindex key index
,指令中的 l 代表的是列表list的意思,将返回key这个列表中,索引为index的这个元素,若是请求的索引不存在,返回 (nil)。
示例:
1 | $ 127.0.0.1:6379> lindex language 0 |
¶修改指定下标的元素
使用 lset key index value
,将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表(key不存在)进行 LSET 时,返回一个错误。
示例:
1 | $ 127.0.0.1:6379> lset language 0 Golang |
¶移除列表中的元素
同理增加值的方式,使用lpop key
和 rpop key
移除列表头部或者尾部的元素,使用这两条命令移除列表元素的同时还会返回移除的值。
示例:
1 | $ 127.0.0.1:6379> lpop language |
¶移除指定个数的单个元素
使用 lrem key count value
,指令中的 l 代表的是列表list的意思,删除列表key中count个值为value的元素。
示例:
1 | $ 127.0.0.1:6379> lrem language 4 python |
注意:返回的是实际删除掉的 values 的个数,使用的时候 count 的大小是可以超过实际个数大小的,但是删除时的返回值是实际删除掉的个数。
¶移除指定位置index的元素
命令里没有根据 index 删除元素的命令,如果想要删除指定index的值,可以采用组合命令的方式,即通过 lset key index value
来修改要删除的位置的元素为某个标志,然后使用 lrem key 0 value
删除所有值为标记的元素(也即是需要删除的位置):
1 | $ 127.0.0.1:6379> lset language 1 del # 将要删除的下表的元素设置为 "del" |
同理删除多个位置上的值,就可以通过 lset key index value
修改多个需要删除的位置上的值为标志值,然后使用 lrem key 0 value
统一删除。
¶移除区间之外的元素
使用 ltrim key start stop
对列表进行修剪(trim),即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
示例:
1 | $ 127.0.0.1:6379> ltrim language 0 1 |
注意,作用的范围是闭区间。
¶获取列表中的元素的个数
llen key
¶只有单条的指令可以通过正负值来指定操作的方向
命令中的 l 代表list的指令(即不使用通过l和r来区分操作方向的指令),都可以通过负值来表示反向操作。
如移除指定个数的元素 lrem key count value
命令根据参数count的值,移除列表中与参数value相等的元素。count的值可以是一下几种:
- count > 0 :从表头开始向表尾搜索,移除与value相等的元素,数量为count。
- count < 0 :从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
- count = 0 : 移除表中所有与value相等的值。
¶使用redis-cli对redis进行集合set操作
集合和列表相似,是用来存储元素的,不同在于,集合是无序的,且元素同一元素只能保存一份,集合中的元素是唯一的。
¶添加
使用 sadd key member1 member2 ...
,因为元素是无序且唯一的,所以不存在左右添加的区别。
示例:
1 | $ 127.0.0.1:6379> sadd team xiaoming xiaowang |
与列表的添加不同,返回的结果不会显示目前集合中元素个数,只会显示本次添加操作中成功添加的个数,重复添加相同的值,则返回0。一次性添加的多个成员中含有集合中已经存在的成员直接无视,添加未存在的。
注意:集合中存储的成员的顺序于添加顺序无关
¶查看集合中的成员
smembers key
¶移除集合中的成员
使用 srem key member1 member2 ...
进行删除,因为集合是没有下标,且集合中的值唯一,所以直接指定需要删除的成员即可。
¶移除并返回一个随机成员
使用 spop key
,会随机删除并返回一个元素
示例:
1 | $ 127.0.0.1:6379> sadd team xiaoming xiaowang |
¶随机获取一个元素不移除
使用 srandmember key [count]
,从 Redis2.6 版本开始, srandmember 命令接受可选的 count 参数:
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
¶查看集合中的成员的个数
使用 scard key
进行查看
示例:
1 | $ 127.0.0.1:6379> scard team |
¶集合之间的操作
¶获取集合的交集
sinter key1 key2
¶获取集合的并集
sunion key1 key2
¶获取集合的差集
sdiff key1 key2
¶使用redis-cli对redis进哈希表hash操作
哈希表类似python中的字典,采用k/v值的形式。
¶添加
使用 hset key field value
进行创建,将哈希表 key 中的域 field 的值设为 value。
示例:
1 | $ 127.0.0.1:6379> hset website baidu www.baidu.com |
返回的内容和string操作时类似,用来显示成功与否,不显示添加的数量
数据的存储样式是:
如果域 field 已经存在于哈希表中,旧值将被覆盖。
示例:
1 | $ 127.0.0.1:6379> hset website google google.com |
¶批量添加
使用hmset key field1 value1 field2 value2 ... ...
示例:
1 | $ 39.106.84.56:6379> hmset website apple www.apple.com huawei www.hauwei.com |
¶获取哈希表中的field对应的值
hget key field
¶批量查看哈希表中的某些field对应的值
hmget key field1 field2 ...
¶删除field中的某个field
hdel key field
¶获取哈希中的所有的field和value
使用 hgetall key
进行获取,打印的样式是 field value 这样一个间隔一个的样式
示例:
1 | $ 127.0.0.1:6379> hgetall website |
¶获取某个哈希中所有的field
hkeys key
¶获取某个哈希中所有的值
hvals key
¶判断哈希中是否存在某个field
使用 hexists key field
示例:
1 | $ 127.0.0.1:6379> hexists website google |
¶获取哈希表中的键值对个数
使用 hlen key
示例:
1 | $ 127.0.0.1:6379> hlen website |
¶为哈希表中的 字段值 加上指定增量值
通过 hincrby key field num
的方式,给hash表中field对应的value增加或者减少相应的数量,注意此操作只能用来对value是数值形式的field进行。
¶事务
Redis事务可以一次执行多个命令,事务具有以下特征:
- 隔离操作:事务中的所有命令都会序列化、按顺序的执行,不会被其他命令打扰。
- 原子操作:事务中的命令要么全部被执行,要么全部不执行。
¶开启一个事务
multi
以后执行的所有的命令,都在这个事务中执行。
¶执行事务
exec
会将在multi和exec中的操作一并提交。
¶取消事务
discard
会将multi后的所有命令取消。
¶监视一个或者多个key
watch key [key ...]
监视一个(或者多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。
¶取消所有key的监视
unwatch
¶发布/订阅操作
¶给某个频道发布消息
publish channel message
¶订阅某个频道的消息
subscribe channel