一、redis基本介绍
1.redis的启动
- 服务端启动
python@ubuntu:~$ redis-server
- 客户端启动
python@ubuntu:~$ redis-cli
<127.0.0.1:6379> exit
python@ubuntu:~$ redis-cli --raw //(支持中文的启动方式)
<127.0.0.1:6379> exit
2.redis基本操作
- ping发送给服务器,服务器返回PONG
<127.0.0.1:6379>ping
PONG
- 数据库没有名称,默认16个,通过0-15来标识
例如,选择编号为1的数据库:
<127.0.0.1:6379>select 1
OK
<127.0.0.1:6379[1]> select 0 //选择1号数据库会带有标识
OK
<127.0.0.1:6379> select 2 //选择0号数据库没有标识,因为默认就是选择0号数据库
OK
<127.0.0.1:6379[2]> select 20
ERR invalid DB index //报错,无效的数据库索引,因为redis只有0-15号数据库
3.redis的数据类型
redis键值对说明
- redis是key-value的数据结构;
- 每条数据都是一个“键值对”;
- 键(key)的类型是字符串(string);
- 值(value)的类型可分为五种:
①字符串string
②哈希hash
③列表list
④无序集合set
⑤有序集合zset
二、redis各种数据类型介绍
1.字符串操作
字符串(string)是redis最基本的类型;
(1)增加、修改——set/mset/setex
- 如果设置的键不存在则为添加,如已存在则为修改;
- redis中字符串(string)可以用单引号’'或者双引号""引起来,也可以省略引号,如:“China”,‘China’,China三种写法都可以;
- 设置键值
set key value
例如:设置键’user1’值为’aaa’
<127.0.0.1:6379> set 'user1' 'aaa' //如果没有为添加
OK
<127.0.0.1:6379> set 'user1' 'bbb' //已存在视为修改
- 设置键值及过期时间,以秒为单位
(新增key的同时,给这个key附加一个过期时间)
setex key seconds value
例如:设置键’user2’值为’bbb’,过期时间为3秒
<127.0.0.1:6379> setex 'user2' 3 'bbb'
OK
- 设置多个键值对——mset
mset key1 value1 key2 value2 ......
例如:设置键’user3’值为’ccc’,设置键’user4’值为’ddd’,设置键’user5’值为’eee’
<127.0.0.1:6379> mset 'user3' 'ccc' 'user4''ddd' 'user5''eee'
OK
(2)追加值——append
append key value
例如:向键’user1’中追加值’haha’
<127.0.0.1:6379> append 'user1' 'haha'
OK
(3)获取值——get/mget
- 获取单个值
- 根据键获取值,如果不存在返回nil
get key
例如:获取键’user1’的值
<127.0.0.1:6379> get'user1'
bbbhaha
<127.0.0.1:6379> get'user2'
// 没有值了,因为设置了3秒过期
<127.0.0.1:6379> get'user3'
ccc
- 获取多个值
mget key1 key2
例如:一次性获取’user1’‘user2’'user3’的值
<127.0.0.1:6379> mget 'user1' 'user4''user5'
bbbhaha
ddd
eee
(4)删除——del
删除键及其对应的值
del key1 key2 ......
例如:删除键值’user2’‘user3’‘user4’
<127.0.0.1:6379> del 'user2''user3''user4'
1 //删除成功返回1
<127.0.0.1:6379> mget 'user2''user3''user4'
// 没有值了,因为上一步删掉了
(5)字符串下的键命令
①查找键
- 参数支持正则表达式,找到键,返回键名,找不到返回空
keys pattern
例如:查找键’user1’是否存在
<127.0.0.1:6379> keys 'user1'
user1 //显示key'user1',因为这个key存在
<127.0.0.1:6379> keys 'user11'
// 没有值,因为这个值不存在
例如:查看所有键
<127.0.0.1:6379> key '*' //或者keys *,加不加''都可以
user1
user2
user3
user4
user5
例如:查看名称包含s的键
key '*S*'
②判断键是否存在
- 如果存在返回1,不存在返回0
exists key
例如:判断键’user1’是否存在
<127.0.0.1:6379> exists 'user1'
1 //返回1,代表这个key'user1'存在
<127.0.0.1:6379> exists 'user111'
0 //返回0,代表这个key'user111'不存在
③查看键对应的value类型(string、hash、list、set、zset)
type key
例如:查看键’user1’的对应的值类型
<127.0.0.1:6379> type 'user1'
string
④设置已存在键的过期时间
- 以秒为单位
设置键值及过期时间,以秒为单位
(已经存在的键,一开始没有设置过期时间,要追加一个过期时间)
expire key seconds
例如:设置键’user2’值为’bbb’,过期时间为3秒
<127.0.0.1:6379> expire 'user2' 100 //设置'user2'的过期时间为100秒
1
⑤查看键有效时间
- 以秒为单位
返回大于0,代表剩余的有效时间,单位:秒;
返回-1为永远有效;
返回-2为键不存在;
ttl key
例如:查看键’user2’的有效时间
<127.0.0.1:6379> ttl 'user1'
-1 //返回-1,代表永远有效
<127.0.0.1:6379> ttl 'user2'
5 //返回正数,代表还剩多少秒过期
<127.0.0.1:6379> ttl 'user2'
-2 //返回了-2,因为上一步剩余5秒的倒计时已经过期,-2代表失效
2.哈希hash
(1)hash介绍
- hash用于存储“键值对”集合;
- 每个哈希中的键可以理解为字段(field),一个字段(field)对应一个值(value);
- hash中值(value)类型为字符串(string);
- 同一个哈希中字段名(field)不可以重复
(2)增加、修改——hset/hmset
- 如果设置的字段不存在则为添加,如已存在则为修改
- 设置单个字段
hset key field value //区分于字符串string类型,set设置字符串的值,hset设置hash的值
例如:设置键’huser1’的字段’name’值为’Tom’
<127.0.0.1:6379> hset 'huser1' 'name' 'Tom'
1 //返回1,表示增加成功
- 设置多个字段,添加多个值
hmset key field1 value1 field2 value2 field3 value3 ......
例如:设置键’huser2’的字段’name’值为’Mary’,设置’sex’字段为’female’
<127.0.0.1:6379> hmset 'huser2' 'name' 'Mary' 'sex' 'female'
OK
(3)获取hash的类型——type
(键的类型是hash,值的类型有可能是hash、有可能是string)
<127.0.0.1:6379> type 'huser1'
hash //代表查询的键是hash类型
<127.0.0.1:6379> keys *
user4 //string类型
user5 //string类型
user1 //string类型
user3 //string类型
huser2 //hash类型
huser1 //hash类型
(4)获取键值对——hget/hkeys
- 获取指定键所有的字段
hkeys key
例如:获取键’huser2’的所有字段
<127.0.0.1:6379> hkeys 'huser2'
name
sex
- 获取一个字段对应的值
hget key field
例如:获取键’user2’的字段’name’的值
<127.0.0.1:6379> hget 'user2' 'name'
Mary
<127.0.0.1:6379> hget 'user2' 'sex'
female
- 获取多个字段的值
hmget key field1 field2
例如:获取键’user2’字段’name’'sex’的值
<127.0.0.1:6379> hmget 'user2' 'name' 'sex'
Mary
female
- 获取所有字段的值
hvals key
例如:获取键’user2’中所有字段的值
<127.0.0.1:6379> hvals 'user2'
Mary
female
- 获取所有字段名包括字段对应的值
hgetall key
例如:获取键’user2’所有字段名包括字段对应的值
<127.0.0.1:6379> hgetall 'user2'
name
Mary
sex
female
(5)删除——hdel/del
- 删除hash中指定字段
字段对应的值会一起删除
hdel key field1 field2 ......
例如:删除键’user2’的字段’sex’
<127.0.0.1:6379> hdel 'user2' 'sex'
1 //返回1,代表删除成功
- 删除整个hash键及字段与值,使用del命令
del key1 key2 ......
例如:删除键’user1’‘user2’
<127.0.0.1:6379> del user1 user2
1 //返回1,代表删除成功
3.列表list
(1)list介绍
- 列表中的值(value)类型为字符串(string);
- 列表中每个值按照添加的顺序排序
(2)增加
- 从左侧插入值
lpush key value1 value2 ......
例如:从键’user1’的列表左侧加入值’aa’
<127.0.0.1:6379> lpush 'user1' 'aa'
1 //返回1,代表该列表中目前有1个值
- 从右侧插入值
rpush key value1 value2 ......
例如:从键’luser1’的列表右侧加入值’bb’
<127.0.0.1:6379> rpush 'luser1' 'bb'
2 //返回2,代表该列表目前有2个值
例如:从键’luser1’的列表右侧加入值’cc’‘dd’
<127.0.0.1:6379> rpush 'luser1' 'cc' 'dd'
4 //返回4,代表该列表目前有4个值
- 在指定值的前或后插入值
linsert key before或after 值 插入的值
例如:在键’luser1’的列表中值’cc’前加入值’11’
<127.0.0.1:6379> linsert 'luser1' before 'cc' '11'
5 //返回5,代表该列表目前有5个值
例如:在键’luser1’的列表中值’cc’后加入值’22’
<127.0.0.1:6379> linsert 'luser1' after 'cc' '22'
6 //返回6,代表该列表目前有6个值
(3)获取
- 返回列表里指定范围内的值
(负值代表从右往左数,正值代表从左往右数)
索引从左侧开始,第一个值的索引为0;
索引可以是负数,表示从尾部开始计数,如:-1表示最后一个值;
start,stop为要获取值的索引
lrange key start stop //l代表list列表,range代表范围
例如:获取键’luser1’的列表所有值
<127.0.0.1:6379> lrange 'luser1' 0 -1 //获取所有值,从第一个到最后一个
aa
bb
11
cc
22
dd
<127.0.0.1:6379> lrange 'luser1' 2 4 //获取从第3个值到第5个值
11
cc
22
<127.0.0.1:6379> lrange 'luser1' 3 -1 //获取从第4个值到最后一个值
cc
22
dd
(4)修改——lset
- 设置指定索引位置的值
索引从左侧开始,第一个值的索引为0;
索引可以是负数,表示从尾部开始,-1代表最后一个值
lset key index value
例如:修改键’luser1’的列表中索引为1的值为’China’
<127.0.0.1:6379> lset 'luser1' 1 'China'
OK
<127.0.0.1:6379> lrange 'luser1' 1
China
(5)删除
- 删除指定值
将列表中前count次出现的值移除;
count>0 从头往尾删除;
(count=2,从左往右删除2个值)
count<0 从尾往头删除;
(count=-2,从右往左删除2个值)
count=0 删除所有值
lrem key count value
例如:向键’luser2’中加入值’h0’‘h1’‘h2’‘h3’‘h0’‘h1’‘h0’‘h1’
<127.0.0.1:6379> rpush 'luser2' 'h0' 'h1' 'h2' 'h3' 'h0' 'h1' 'h0' 'h1'
8 //返回8,代表列表中有8个值
例如:从键’luser2’列表右侧开始删除1个h1
<127.0.0.1:6379> lrem 'luser2' -1 'h1' //从右往左,删除1个h1
1 //返回1,代表删除了1个值
例如:删除列表中所有的指定值
<127.0.0.1:6379> lrem 'luser2' 0 h1 //删除列表中所有的h1
2
<127.0.0.1:6379> lrange 'luser2' 0 -1
h0
h2
h3
h0
h0
例如:删除列表中从左往右,1个h0
<127.0.0.1:6379> lrem 'luser2' 1 h0 //从左往右,删除1个h0
1
<127.0.0.1:6379> lrange 'luser2' 0 -1
h2
h3
h0
h0
4.无序集合set
(1)set介绍
- 无序集合中值(value)类型为字符串(string);
- 集合里不允许有重复的值;
- 说明:对于集合里的值只能添加与删除,不能修改
(2)增加——sadd
- 集合中添加值
sadd key value1 value2 ......
例如:向键’suser1’的集合添加值’aa’‘bb’‘cc’
<127.0.0.1:6379> sadd 'suser1' 'aa' 'bb' 'cc'
3
例如:向键’suser1’的集合添加值’aa’,是没有意义的,因为集合中’aa’已经存在
<127.0.0.1:6379> sadd 'suser1' 'aa'
(3)获取
- 返回所有值
smembers key
例如:获取键’suser1’的集合所有值,返回结果是无序的
<127.0.0.1:6379> smembers 'suser1'
aa
bb
cc
(4)删除
- 删除指定值
srem key value
例如:删除键’suser1’的集合中值’aa’
<127.0.0.1:6379> srem 'suser1' 'aa'
1
<127.0.0.1:6379> smembers 'suser1'
bb
cc
5.有序集合zset
(1)zset介绍
- 有序集合中值(value)类型为字符串(string);
- 集合里不允许有重复的值;
- 每个值都会关联一个分数(score),分数(score)可以为负数,通过分数将值从小到大排序;
- 说明:对于有序集合里的值只能添加与删除,不能修改
(2)增加
- 添加值
zadd key score1 value1 score2 value2 ......
例如:向键’zuser1’的集合中添加值’aa’‘bb’‘cc’‘dd’,分数分别是1,5,8,3
<127.0.0.1:6379> zadd 'zuser1' 1 'aa' 3 'dd' 6 'cc' 2 'ff' //添加的值,会按照score从小到大排序
(3)获取值
- 返回指定范围内的值
start,stop为值的下标索引;
第一个值的索引为0;
索引可以是负数,表示从尾部开始计数,-1表示最后一个值;
withscores:加上能同时获取值对应分数(score)
zrange key start stop[withscores]
例如:获取键’zuser1’的集合中所有值
<127.0.0.1:6379> zrange 'zuser1' 0 -1
aa
ff
dd
cc
例如:获取键’zuser1’的集合中所有值,同时获取每个值对应的分数
<127.0.0.1:6379> zrange 'zuser1' 0 -1 withscores
aa
1
ff
2
dd
3
cc
6
- 通过score获取值
返回分数(score)在min和max之间的值
min代表score的起始值
max代表score的结束值
zrangebyscore key min max
例如:获取键’zuser1’的集合中分数(score)在4和9之间的值
<127.0.0.1:6379> zrangebyscore 'zuser1' 3 9
dd
cc
- 返回值value的分数(score)
zscore得到指定值的score
zscore key value
例如:获取键’zuser1’的集合中值’aa’的分数
<127.0.0.1:6379> zscore 'zuser1' 'dd'
3
(4)删除
- 删除指定值
zrem key value1 value2 ......
例如:删除键’zuser1’中的值’bb’
<127.0.0.1:6379> zrem 'zuser1' 'dd'
1
- 删除分数(score)在指定范围之间的值
min是要删除score的最小值
max是要删除score的最大值
zremrangebyscore key min max
例如:删除键’zuser1’中分数在4,9之间的值
<127.0.0.1:6379> zremrangebyscore 'zuser1' 0 10
3
<127.0.0.1:6379> zrange zuser1 0 -1 withscores
// 返回空,因为上条指令全删掉了