redis

Redis

概念

​ Redis 一个内存数据库,通过 Key-Value 键值对的的方式存储数据。由于 Redis 的数据都存储在内存中,所以访问速度非常快,因此 Redis <u大量用于缓存系统</u,存储热点数据,可以极大的提高网站的响应速度。

优点

  • 支持数据的持久化,通过配置可以将内存中的数据保存在磁盘中,Redis 重启以后再将数据加载到内存中;
  • 支持列表,哈希,有序集合等数据结构
  • 原子操作,Redis 的所有操作都是原子性的,这使得基于 Redis 实现分布式锁非常简单;
  • 支持发布/订阅功能,数据过期功能;

基本命令

1
2
3
4
5
6
7
8
9
10
11
keys *  返回键(key)
keys list* 返回名以list开头的所有键(key)
exists list1 判断键名为list1的是否存在 存在返回1, 不存在返回0
del list1 删除一个键(名为list1)
expire list1 10 设置键名为list1的过期时间为10秒后
ttl list1 查看键名为list1的过期时间,若为-1表示永不过期,-2表示已过期
move age 1 将键名age的转移到1数据库中。
select 1 表示进入到1数据库中,默认在0数据库
persist age 移除age的过期时间
flushdb 删除所有的数据 清除当前所在库的所有数据
flushall 清空所有数据

数据类型

常用五种: 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)

String(字符串类型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
set 键  值   键存在则只覆盖 例如: set name zhangsan
get 键 获取一个键的值 例如:get name
setnx 键 值 设置一个不存在的键和值(防止覆盖), 若键已存在则返回0表示失败
setex 键 [有效时间] 值 设置一个指定有效期的键和值(单位秒) 例如: setex color 10 red
setrange命令:替换子字符串 (替换长度由子子串长度决定)
setrange 键 位置 子字串
setrange name 4 aa 将name键对应值的第4个位置开始替换
mset 键1 值1 键2 值2 键3 值3 .... 批量设置键和值,
msetnx 键1 值1 键2 值2 键3 值3 .... 批量设置不存在的键和值
getset命令:获取原值,并设置新值
getrange命令:获取指定范围的值
getrange 键 0 4 获取指定0到4位置上的值
mget命令: 批量获取值
mget 键1 键2 键3....
incr命令: 指定键的值做加加操作,返回加后的结果。
incrby命令: 设置某个键加上指定值
incrby 键 m 其中m可以是正整数或负整数
decr命令: 指定键的值做减减操作,返回减后的结果。
decr 键 例如: decr kid
decrby命令: 设置某个键减上指定值
decrby 键 m 其中m可以是正整数或负整数
append命令:给指定key的字符串追加value,返回新字符串值的长度
append 键 追加字串
strlen求长度 strlen 键名 返回对应的值。

Hash类型

1
2
3
4
5
6
7
8
9
10
11
hset hash名 键  值  设置一个哈希表的键和值   如:hset user:001 name zhangsan
hget命令: 获取执行哈希名中的键对应值
hsetnx hash名 键 值 设置一个哈希表中不存在的键和值 成功返回1,失败返回0 如:hsetnx user:001 name zhangsan
hmset user:001 username zhangsan age 20 sex 1 批量设置
hmget user:001 username age sex 批量获取值
hexists user:001 name 是否存在, 若存在返回1
hlen user:001 获取某哈希user001名中键的数量
hdel user:001 name 删除哈希user:001 中name键
hkeys user:002 返回哈希名为user:002中的所有键。
hvals user:002 返回哈希名为user:002中的所有值。
hgetall user:002 返回哈希名为user:002中的所有键和值。

List列表(双向链表结构)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
list即可以作为“栈”也可以作为"队列"。
操作:
lpush list1 "world" 在list1头部压入一个字串
lpush list1 "hello" 在list1头部压入一个字串
lrange list1 0 -1 获取list1中内容 0:表示开头 -1表示结尾。
rpush list2 "world" 在list2尾部压入一个字串
rpush list2 "hello" 在list2尾部压入一个字串
lrange list2 0 -1 获取list2中内容 0:表示开头 -1表示结尾。
linsert list2 before hello there 在key对应list的特定位置前或后添加字符串
lset list2 1 "four" 修改指定索引位置上的值
lrem list2 2 "hello" 删除前两个hello值
lrem list2 -2 "hello" 删除后两个hello值
lrem list2 0 "hello" 删除所有hello值
ltrim mylist8 1 3 删除此范围外的值
lpop list2 从list2的头部删除元素,并返回删除元素
rpop list2 从list2的尾部删除元素,并返回删除元素
rpoplpush list1 list2 将list1的尾部一个元素移出到list2头部。并返回
lindex list2 1 返回list2中索引位置上的元素
llen list2 返回list2上长度

Redis 集合(Set)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sadd myset "hello" 向myset中添加一个元素 成功返回1,失败(重复)返回0
smembers myset 获取myset中的所有元素(结果是无序的)
srem myset "one" 从myset中删除一个one 成功返回1,失败(不存在)返回
spop myset 随机返回并删除myset中的一个元素
srandmember myset 随机获取myset中的一个元素,但是不删除
move myset1 myset2 zhangsan:将myset1中zhangsan移动到myset2中
scard myset1 返回myset1的个数
sismember myset zhangsan:判断张三是否在myset中
sdiff myset1 myset2 返回两个集合的差集 以myset1为标准,获取myset2中不存在的。
sdiffstore dstset myset1 myset2 ... 返回所有集合的差集,并保存到dstset中
sinter myset1 myset2 myset3... 返回N个集合中的交集
sinterstore dstset myset1 myset2 ... 返回N个集合的交集并存储到dstset中
sunion myset1 myset2 ...返回所有集合的并集
sunionstore dstset myset1 myset2 返回所有集合的并集,并存储到dstset中

Redis 有序集合Sset (sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

1
2
3
4
5
6
7
8
9
10
11
12
13
zadd zset 70 张三向zset中添加zhangsan,分数为70
zrem zset zhangsan:删除zset中zhangsan
zincrby zset 60 zhangsan:如果zhangsan存在,分数增加60,如果zhangsan不存在,分数就是60
zrange zset 0 -1 withscores:根据score排序(根据score从小到大排序)
zrevrange zset 0 -1 withscores:根据score排序(根据score从大到小排序)
zrank zset zhangsan:返回zhangsan在zset中排名(从小到大的排序)
zrevrank zset zhangsan:返回zhangsan在zset中排名(从大到小的排序)
zrangebyscore zset 60 80 withscores:返回集合中score在给定区间的元素(包含60和80)
zcount zset 60 80:返回集合中给定区间的数量
zcard zset:返回集合中元素的个数
zscore zset zhangsan:返回zhangsan元素的score
zremrangebyrank zset 3 3:删除集合中排名在给定区间的元素 (从小到大)
zremrangebyscore zset 10 20:删除 zset中 分数在 指定区间的元素