3.1 简介
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
3.2 Redis-Key
# 创建一个叫做name的键
set name qwe
# 获取key对应的value
get name
# 判断当前的key是否存在
exists name
# 将当前的key移动到几号数据库
move name 1
# 设置key的过期时间
expire name 10
# 查看当前key的剩余时间
ttl name
# 查询当前key的类型
type name
3.3 String
# 设置key1的值
set key1 "indi"
# 追加字符串,如果当前key不存在,就相当于set key
append key1 "hello"
# 获取字符串的长度!
strlen key1
# 设置初始浏览量为0
set views 0
####################################################################
# 自增1
incr views
# 自减1
decr views
# 可以设置步长,指定增量
incrby views 10
# 也可以指定减量
decrby views 5
####################################################################
# 截取字符串,从下标0开始截取到下标3,
getrange key1 0 3
# 截取全部字符串
getrange key1 0 3
# 替换从指定位置开始的字符串
setrange key1 1 qwe
####################################################################
# 设置key1的值30秒过期
setex key1 30 "hello"
# 如果key1不存在的话设置值,如果存在,则创建失败
setnx key1 "hi"
# 批量设置值
mset k1 v1 k2 v2 k3 v3
# 批量获取值
mget k1 k2 k3
# 原子性操作,要么一起成功,要么一起失败
msetnx k1 v1 k4 v4
# 设置一个名为 user:1 的对象 值为json字符来保存一个对象
set user:1 {name:zhangsan, age:3}
# 批量设置对象的值
mset user:1:name zhangsan user:1:age 2
# 批量获取对象的值
mget user:1:name user:1:age
# 先get后set
127.0.0.1:6379> getset db redis # 如果不存在值,则返回 nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb # 如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb
3.4 List
# 将一个值或多个值,插入到列表头部(左)
lpush list one
# 获取list中的所有值
lrange list 0 -1
# 获取指定区间的值
lrange list 0 0
# 将一个值或多个值,插入到列表尾部(右)
rpush list four
# 移除左侧第一个元素
lpop list
# 移除右侧第一个元素
rpop list
# 通过下标获取list中的某个值
lindex list 0
# 返回列表的长度
llen list
# 移除list集合中指定个数的value,精确匹配
lrem list 1 one
lrem list 2 three
# 通过下标截取list
ltrim list 0 1
# 移除列表的最后一个元素,将它移动到新的列表中
rpoplpush mylist myotherlist
# 将列表中指定下标的值替换为另外一个值,如果要替换的值或者列表不存在则会报错
lset list 0 "item"
# 将某一个具体的值插入到列表中某个元素的前面或者后面
linsert mylist before "world" "other"
linsert mylist after "world" "qweqwe"
小结
- List实际上是一个链表,before Node after,left,right都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表列表不存在!
- 在两边插入或者改动值,效率最高!中间元素,效率相对低一点
- 可以用它做消息排队,消息队列(lpush rpop),栈(lpush lpop)!
3.5 Set
set中的值无法重复
# 往set集合中添加元素
SADD myset "hello0"
# 查看指定set的所有值
SMEMBER myset
# 判断某一个值是否在set集合中,有则返回1,没有则返回0
SISMEMBER myset hello0
# 获取set集合中的元素个数
scard myset
# 移除set集合中的指定元素
srem myset hello
# 随机抽选出一个元素
SRANDMEMBER myset
# 随机抽选出指定个数的元素
SRANDMEMBER myset 2
# 随机删除key
spop myset
# 将一个指定的值,移动到另外一个set集合中
smove myset myset2 "hello"
# 差集:比较两个set集合,查询第一个集合中不同的元素
sdiff key1 key2
# 交集:查询两个set集合中相同的元素
sinter key1 key2
# 并集:去重查询两个set集合中所有的元素
sunion key1 key2
微博,A用户将所有关注的人放在了一个set集合中,将它的粉丝也放在一个集合中!
共同关注,共同爱好,共同好友,推荐好友,都可以使用set实现!
3.6 Hash
Map集合,key-map!这个值是一个map的集合,本质和String类型没有什么区别,还是一个简单地key-value
# 设置一个具体的key-value
127.0.0.1:6379> hset myhash field1 qwe
(integer) 1
# 获取对应的value
127.0.0.1:6379> hget myhash field1
"qwe"
# 设置或修改多个字段值
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
# 获取多个字段值
127.0.0.1:6379> hmget myhash field1 field2
1) "hello"
2) "world"
# 展示全部的key-value
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
# 根据value删除
127.0.0.1:6379> hdel myhash field1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
# 获取hash表的字段数量
127.0.0.1:6379> hlen myhash
(integer) 1
# 判断hash中指定字段是否存在
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
# 获取所有的字段
127.0.0.1:6379> HKEYS myhash
1) "field2"
# 获取所有的值
127.0.0.1:6379> HVALS myhash
1) "world"
# 指定增量
127.0.0.1:6379> HINCRBY myhash field1 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field1 -1
(integer) 5
# 判断值是否存在于hash中,如果不存在则创建,存在则不创建
127.0.0.1:6379> hsetnx myhash field2 hello
(integer) 0
127.0.0.1:6379> hsetnx myhash field3 hello
(integer) 1
# 存储对象
127.0.0.1:6379> hset user:1 name qwe
(integer) 1
# 获取对象
127.0.0.1:6379> hget user:1 name
"qwe"
hash最多应用在变更的数据上,尤其是用户信息的保存,经常变动的信息!所以hash更适合对象的存储,String则更加适合字符串存储。
3.7 Zset(有序集合)
在set的基础上增加了一个值,以实现排序等等
# 添加一个值
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two
(integer) 1
# 添加多个值
127.0.0.1:6379> zadd myzset 3 three 4 four
(integer) 2
# 显示列表
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
# 添加3个用户
127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 kua
(integer) 1
# 按照最小值到最大值排列所有用户
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
1) "kua"
2) "xiaohong"
3) "zhangsan"
# 使用(代表<,不加代表<=,返回 0 < score <=600 的用户
127.0.0.1:6379> ZRANGEBYSCORE salary (0 600 withscores
1) "kua"
2) "500"
# 显示区间内用户,并且附带工资
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
1) "kua"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
# 从小到大排序
127.0.0.1:6379> zrange salary 0 -1
1) "kua"
2) "xiaohong"
3) "zhangsan"
# 从大到小排序
127.0.0.1:6379> zrevrange salary 0 -1
1) "zhangsan"
2) "xiaohong"
3) "kua"
# 移除有序集合中的指定元素
127.0.0.1:6379> zrem salary kua
(integer) 1
# 获取有序集合中的个数
127.0.0.1:6379> zcard salary
(integer) 2
# 获取指定区间的成员数量
127.0.0.1:6379> zcount myset 1 3 # 获取指定区间的成员数量!
(integer) 3
适用于:set 排序、存储班级成绩表、工资表排序!
普通消息:1,重要消息:2,带权重进行判断!
排行榜应用实现,取Top N 测试!