1.何为Redis
- Redis是NoSQL数据库,是一种非关系型数据库。
- Redis将数据保存在内存中,因此速度超快。
- Redis中只有键值对(即key和value)。
- Redis共有八种数据类型,常用的有五种数据类型。
- Redis中单个Key最大支持到512M。
- Redis有 0~15号库,也就是说有16个库,默认使用0号库。
- Redis使用的端口号为6379。
我们以下的操作均使用阿里云服务器Ubuntu系统进行,阿里云服务器的购买、端口配置及Redis的安装请参考我的这篇博客。
redis-cli # 运行redis
config set requirepass 密码 # 设置redis的密码
auth 密码 # 输入密码,获得操作权限
2.Redis公共操作
以下为公共操作,
select 1 # 选择1号数据库
keys * # 获取所有的key
keys t* # 获取所有键以t开头的key
dbsize # 获取当前数据库的key的数量
flushdb # 清空当前库中的key
flushall # 清空所有库中的key
3.五种常用数据类型
在Redis中我们常用的数据类型有以下五种,
- string字符类型,最基本的数据类型。
- hash哈希,缓存常用的。
- list,列表。
- set无序集合。
- zset有序集合。
3.1.String类型
我们先看一下单个键值对的相关操作,
127.0.0.1:6379> set username zhangsan # 添加一个键值对,键为 username ,值为 zhangsan
OK
127.0.0.1:6379> keys * # 获取所有的键
1) "username" # 返回 username
127.0.0.1:6379> get username # 获取键 username 所对应的值
"zhangsan"
127.0.0.1:6379> strlen username # 获取键为 username 的值的长度
(integer) 8
127.0.0.1:6379> set name lisi # 添加一个键值对,键为 name ,值为 lisi
OK
127.0.0.1:6379> keys * # 获取所有的键
1) "username"
2) "name"
127.0.0.1:6379> del name # 删除键为 name 的键值对
(integer) 1 # 返回值为1,即为真,删除成功
127.0.0.1:6379> keys * # 获取所有的键
1) "username"
127.0.0.1:6379> ttl username # 查看键为 username 的键值对的过期时间
(integer) -1 # 返回值为-1,说明永不过期。如果返回值为-2,说明已过期;如果返回值为正数(如n),说明经过n秒后,该键值对过期
127.0.0.1:6379> expire username 10 # 设置键为 username 的键值对10秒后过期
(integer) 1
# 经过5秒后运行以下代码
127.0.0.1:6379> ttl username # 查看键为 username 的键值对的过期时间
(integer) 5 # 返回值为5,说明再经过5秒后该键值对过期
# 再经过10秒后运行以下代码
127.0.0.1:6379> ttl username # 查看键为 username 的键值对的过期时间
(integer) -2 # 返回值为-2,说明该键值对已经过期
127.0.0.1:6379> setex name 10 lisi # 添加一个10秒后会过期的,键为 name ,值为 lisi 的键值对
OK
# 经过3秒后运行以下代码
127.0.0.1:6379> ttl name # 查看键为 name 的键值对的过期时间
(integer) 7
127.0.0.1:6379> get name # 查看键为 name 的键值对的值
"lisi"
# 再经过10秒后运行以下代码
127.0.0.1:6379> ttl name # 查看键为 name 的键值对的过期时间
(integer) -2
127.0.0.1:6379> get name # 查看键为 name 的键值对的值
(nil) # 返回值为空
127.0.0.1:6379> set num 1 # 添加一个键值对,键为 name ,值为 lisi
OK
127.0.0.1:6379> get num # 获取键为 num 的键值对的值
"1"
127.0.0.1:6379> incr num # 键为 num 的键值对的值自增1
(integer) 2
127.0.0.1:6379> incrby num 12 # 键为 num 的键值对的值自增12
(integer) 14
127.0.0.1:6379> incrbyfloat num 0.12 # 键为 num 的键值对的值自增0.12
"14.12"
# 自减为decr
我们接下来看一下对于多个键值对的操作,
127.0.0.1:6379> mset name1 zhao name2 qian name3 sun name4 li # 批量添加键值对,一个键对应一个值
OK
127.0.0.1:6379> keys *
1) "num"
2) "name2"
3) "name4"
4) "name1"
5) "name3"
# 我们可以看到成功添加了name1,name2,name3,name4
127.0.0.1:6379> mget name1 name2 name3 name4 # 批量获取键对应的值
1) "zhao"
2) "qian"
3) "sun"
4) "li"
3.2.hash类型
hash是键值对的集合,特别适合存放对象。
以下是hash类型的相关操作,
127.0.0.1:6379> hset user1 name zhangsan age 18 sex 0 # 添加一个hash对象 user1 ,其 name 为 zhangsan , age 为18, sex 为0
(integer) 3
127.0.0.1:6379> keys *
1) "user1"
127.0.0.1:6379> hget user1 name
"zhangsan"
127.0.0.1:6379> hget user1 age
"18"
127.0.0.1:6379> hvals user1 # 获取 user1 中所有的值
1) "zhangsan"
2) "18"
3) "0"
127.0.0.1:6379> hmget user1 name age sex # 批量获取 user1 中键对应的值
1) "zhangsan"
2) "18"
3) "0"
127.0.0.1:6379> hlen user1 # 获取 user1 中键值对的个数
(integer) 3
127.0.0.1:6379> hstrlen user1 name # 获取 user1 中键 name 对应值的长度
(integer) 8
127.0.0.1:6379> hexists user1 name # 成员判断,判断 user1 中是否存在键 name
(integer) 1 # 返回1表示存在
127.0.0.1:6379> hexists user1 hobby
(integer) 0 # 返回0表示不存在
3.3.list列表
以下为list列表的相关操作,
127.0.0.1:6379> lpush language python # 从 language 列表左侧插入 python
(integer) 1
127.0.0.1:6379> lpush language java # 从 language 列表左侧插入 java
(integer) 2
127.0.0.1:6379> rpush language ruby # 从 language 列表右侧插入 ruby
(integer) 3
127.0.0.1:6379> rpush language C # 从 language 列表右侧插入 C
(integer) 4
127.0.0.1:6379> lrange language 0 3 # 从 language 列表左侧获取索引为0到3的值
1) "java"
2) "python"
3) "ruby"
4) "C"
127.0.0.1:6379> lpop language # 从 language 列表左侧弹出一个值
"java" # 弹出值为java
127.0.0.1:6379> rpop language # 从 language 列表右侧弹出一个值
"C" # 弹出值为c
127.0.0.1:6379> lindex language 0 # 获取 language 列表中索引为0的值
"python"
127.0.0.1:6379> llen language # 获取 language 列表值的个数
(integer) 2
127.0.0.1:6379> lset language 1 PHP # 将 language 列表中索引为1的值修改为 PHP
OK
127.0.0.1:6379> lindex language 1 # 获取 language 列表中索引为1的值
"PHP"
3.4.set无序集合
我们要注意集合的唯一性。
以下为set无序集合的相关操作,
127.0.0.1:6379> sadd redis 1 2 3 4 5 # 添加一个 redis 无序集合,其成员为1、2、3、4、5
(integer) 5
127.0.0.1:6379> smembers redis # 查看无序集合 redis 的所有成员
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
# 集合运算
# 1.差集
127.0.0.1:6379> sadd mysql 1 2 3 # 添加一个 mysql 无序集合,其成员为1、2、3
(integer) 3
127.0.0.1:6379> sdiff mysql redis # 求 mysql 与 redis 的差集
(empty list or set) # 为空集
127.0.0.1:6379> sdiff redis mysql # 求 redis 与 mysql 的差集
1) "4"
2) "5"
# 注意:差集的结果与参数顺序有关,长参数一般放在第一位
# 2.交集
127.0.0.1:6379> sinter redis mysql # 求 redis 与 mysql 的交集
1) "1"
2) "2"
3) "3"
# 交集的结果与参数顺序无关
# 3.并集
127.0.0.1:6379> sunion redis mysql # 求 redis 与 mysql 的并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
# 并集的结果与参数顺序无关
127.0.0.1:6379> sismember redis 3 # 判断3是否是 redis 的成员
(integer) 1
127.0.0.1:6379> sismember redis 30 # 判断30是否是 redis 的成员
(integer) 0
3.5.zset有序集合
zset有序集合的相关操作如下,
# 注意:zset不同于set,zset多了一个 score 参数
127.0.0.1:6379> zadd z1 0 zhao # 给 z1 有序集合添加一个 score 为0,值为 zhao 的数据
(integer) 1
127.0.0.1:6379> zadd z1 0 qian # 给 z1 有序集合添加一个 score 为0,值为 qian 的数据
(integer) 1
127.0.0.1:6379> zadd z1 1 sun # 给 z1 有序集合添加一个 score 为1,值为 sun 的数据
(integer) 1
127.0.0.1:6379> zadd z1 1 li # 给 z1 有序集合添加一个 score 为1,值为 li 的数据
(integer) 1
127.0.0.1:6379> zadd z1 1 zhou # 给 z1 有序集合添加一个 score 为1,值为 zhou 的数据
(integer) 1
127.0.0.1:6379> zadd z1 2 wu # 给 z1 有序集合添加一个 score 为2,值为 wu 的数据
(integer) 1
# 注意:同一个有序集合中,不能有重复值,即使该值在有不同的 score
127.0.0.1:6379> zadd z1 2 li # 给 z1 有序集合添加一个 score 为2,值为 li 的数据
(integer) 0 # 返回值为0,添加失败
127.0.0.1:6379> zrange z1 0 2 # 取出有序集合 z1 中索引值为0到2的值,类似于list中的lrange操作
1) "qian"
2) "zhao"
3) "sun"
127.0.0.1:6379> zrangebyscore z1 0 1 # 取出有序集合 z1 中 score 为0到1的值
1) "qian"
2) "zhao"
3) "sun"
4) "zhou"
127.0.0.1:6379> zcount z1 0 1 # 获取序集合 z1 中 score 为0到1的值的数量
(integer) 4