Redis-Key
keys * #查看所有的key ttl name #查看当前key剩余秒数 type name #查看当前key为name的值类型 exists key #判断值是否存在 move name 1 #移动key为name到数据库1 expire name 10 #设置key为name的值10s后过期 append key1 "hello" #追加 strlen key1 # 查看key为key1的长度 flushdb #清空当前数据库, flushall #清空所有数据库
del key 适用于当key存在是删除key
String
set key1 v1 #设置值
get key1 #获得值
append key1 "hello" #追加,如果key不存在,相当于set key
127.0.0.1:6379> get s1
"1"
127.0.0.1:6379> APPEND s1 2
(integer) 2
127.0.0.1:6379> get s1
"12"
strlen key1 # 查看key为key1的长度
incr views # 自加1,string转换为integer并自增1
decr views # 自减1,string转换为integer并自减1
incrby views 10 # 自加10,步长为10,string转换为integer并自增10
decrby views 10 # 自减10,步长为10,string转换为integer并自减10
getrange key1 0 3 # 查看字符串范围 0到3(包括3)
getrange key1 0 -1 # 查看字符串全部范围
setrange key1 3 xxx # 替换指定位置3的字符串
127.0.0.1:6379> GETRANGE s1 0 -1
"134"
127.0.0.1:6379> SETRANGE s1 0 22
(integer) 3
127.0.0.1:6379> get s1
"224"
setex #(set with expire) 设置过期时间
setex key3 30 "hello"
setnx #(set if not exist) 不存在再设置
setnx mykey "redis"
mset k1 v1 k2 v2 k3 v3 # 批量设置值
mget k1 k2 k3 # 批量获取值
msetnx k1 v1 k4 v4 # 当不存在时批量设置值 msetnx是一个原子性的操作,要么一起成功,要么一起失败
对象
set user:1 {name:zhangsan,age:3}
批量设置对象
这里的key是一个巧妙的设计:user:{id}:{filed},如此设计可以极大的提升复用率
mset user:2:name lisi user:2:age 21
OK
mget user:2:name user:2:age
"lisi"
"21"
getset key1 redis #先获取,再设置,如果不存在返回nil,设置新值,如果存在,替换原来的值
127.0.0.1:6379> GETSET s1 5
"2"
127.0.0.1:6379> get s1
"5"
value除了是字符串还可以是数字
string类似的使用场景:
- 计数器
- 统计多单位的数量
Hash
map集合,key-map,这时候值是一个map集合,本质上和string类型没有太大区别,还是一个简单的key-vlaue,类型变成是hash,有序结合,后加入排后面
设置一个hash值
127.0.0.1:6379> HSET myhash field1 testhash
(integer) 1
127.0.0.1:6379> HGET myhash field1
"testhash"
设置多个hash值,当key重复时会覆盖原来的内容
目前hget和hmget的作用已经一样,都可同时设置多个filed,推荐使用hmget
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hmget myhash field1 field2
"hello"
"world"
删除指定字段内容
127.0.0.1:6379> hmset myhash1 test1 111 test2 222
OK
127.0.0.1:6379> get myhash1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> hmget myhash1 test1 test2
"111"
"222"
127.0.0.1:6379> hdel myhash1 test1
(integer) 1
127.0.0.1:6379> hmget myhash1 test1 test2
(nil)
"222"
获取所有hash字段
127.0.0.1:6379> hgetall myhash1
"test2"
"222"
获取hash内容长度
127.0.0.1:6379> hlen myhash1
(integer) 1
判断hash字段是否存在
127.0.0.1:6379> hexists myhash1 test2
(integer) 1
127.0.0.1:6379> hexists myhash1 test3
(integer) 0
获取所有hash key或者value
127.0.0.1:6379> hkeys myhash
"field1"
"field2"
127.0.0.1:6379> hvals myhash
"hello"
"world"
127.0.0.1:6379> hset myhash field3 5
(integer) 1
给hash某个字段指定增量
127.0.0.1:6379> hincrby myhash field3 1
(integer) 6
给hash某个字段指定减量
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
判断hash某个字段是否存在,不存在则可以设置,存在则不可以设置(应用分布式锁)
127.0.0.1:6379> hsetnx myhash field4 hello
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world
(integer) 0
hash更适合对象的存储
List
有序,可重复
127.0.0.1:6379> LPUSH list1 one
(integer) 1
127.0.0.1:6379> LPUSH list1 two
(integer) 2
127.0.0.1:6379> LPUSH list1 three
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1
"three"
"two"
"one"
127.0.0.1:6379> LRANGE list1 0 1
"three"
"two"
127.0.0.1:6379> RPUSH list2 one
(integer) 1
127.0.0.1:6379> RPUSH list2 two
(integer) 2
127.0.0.1:6379> RPUSH list2 three
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1
"one"
"two"
"three"
127.0.0.1:6379> LRANGE list2 0 1
"one"
"two"
#lpop 默认弹出左边第一个元素,rpop默认弹出右边第一个元素
127.0.0.1:6379> LRANGE list1 0 -1
"three"
"two"
"one"
127.0.0.1:6379> LPOP list1
"three"
127.0.0.1:6379> RPOP list2
"three"
#lindex 通过下标获取值
127.0.0.1:6379> LINDEX list1 0
"two"
#llen 获取keylist的长度
127.0.0.1:6379> LLEN list1
(integer) 2
#LREM key count VALUE
#count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
#count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
#count = 0 : 移除表中所有与 VALUE 相等的值。
#精确移除list1中的一个值:one,精度匹配
127.0.0.1:6379> LREM list1 1 one
(integer) 1
127.0.0.1:6379> LRANGE list1 0 -1
"two"
#通过下标截取指定下标的list操作,截取后只剩下截取后的结果
#redis 127.0.0.1:6379> LTRIM KEY_NAME START STOP
127.0.0.1:6379> LRANGE list 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> LTRIM list 0 2
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "1"
2) "2"
3) "3"
#弹出一个值到另一个列表中
#lpoplpush mylist myotherlist # 移除列表的最后一个元素,将他移动到新的列表
#lset更新操作,目标元素要先存在,否则失败
#redis 127.0.0.1:6379> LSET KEY_NAME INDEX VALUE
127.0.0.1:6379> LSET list 0 4
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "4"
2) "2"
3) "3"
#linsert 列表插入操作
#linsert mylist before "world" "other"
127.0.0.1:6379> LRANGE list1 0 -1
"three"
"one"
"two"
127.0.0.1:6379> LINSERT list1 before one onebefore
(integer) 4
127.0.0.1:6379> LRANGE list1 0 -1
"three"
"onebefore"
"one"
"two"
可以有重复元素
基本的数据类型,列表
在redis中,可以设计成栈,队列,阻塞队列
所有的list命令都是l开头的,并且获取命令都是默认先进后出原则
set
无序,不可重复
127.0.0.1:6379> SADD myset hello
(integer) 1
127.0.0.1:6379> SADD myset world
(integer) 1
127.0.0.1:6379> SMEMBERS myset #查看set 集合中添加的值
"world"
"hello"
127.0.0.1:6379> SISMEMBER myset hello # 判断set 集合中的值是否存在
(integer) 1
127.0.0.1:6379> SCARD myset # 查看集合中有多少元素
(integer)
127.0.0.1:6379> SREM myset hello # 移除指定的一个或多个集合元素
(integer) 1
127.0.0.1:6379> SMEMBERS myset
"world"
set无序不重复集合,抽随机
127.0.0.1:6379> SMEMBERS myset
"test3"
"test2"
"test4"
"world"
"test1"
127.0.0.1:6379> SRANDMEMBER myset # 随机抽取一个集合中的元素
"test4"
127.0.0.1:6379> SRANDMEMBER myset 1
"test4"
127.0.0.1:6379> SRANDMEMBER myset 2
"test2"
"test4"
随机删除指定的key并返回,区分srem
127.0.0.1:6379> SPOP myset
"test2"
127.0.0.1:6379> SMEMBERS myset
"test3"
"test4"
"world"
"test1"
127.0.0.1:6379> SPOP myset 2
"test1"
"test3"
将一个指定的值,移动到另一个set集合中
127.0.0.1:6379> SMEMBERS myset
"test5"
"test6"
"test4"
"world"
127.0.0.1:6379> SMOVE myset myset2 world
(integer) 1
127.0.0.1:6379> SMEMBERS myset2
"world"
"t1"
共同关注 (并集)
数字集合类:
差集
交集
并集
查看差集
127.0.0.1:6379> sadd skey1 a
(integer) 1
127.0.0.1:6379> sadd skey1 b
(integer) 1
127.0.0.1:6379> sadd skey1 v
(integer) 1
127.0.0.1:6379> sadd skey2 v
(integer) 1
127.0.0.1:6379> sadd skey2 c
(integer) 1
127.0.0.1:6379> sadd skey2 d
(integer) 1
127.0.0.1:6379> SDIFF skey1 skey2
"b"
"a"
查看交集
127.0.0.1:6379> SINTER skey1 skey2
"v"
查看并集
127.0.0.1:6379> SUNION skey1 skey2
"v"
"b"
"a"
"d"
"c"
微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!共同关注,共同爱好,二度好友,推荐好友(六度分割理论)
zset
有序集合,不可重复,每个元素关联一个double类型分数score,通过此数据进行从小到大排序。该集成员是唯一的,但每个成员的分数可以一致。
在set的基础上,增加了一个值,对比:sadd myset hello,zadd myzset 1 hello
所有zset的命令都是以z开头的
设置一个有序集合一个值
127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 2 two 3 three
(integer) 2
获取有序集合
127.0.0.1:6379> ZRANGE myzset 1 -1
"two"
"three"
127.0.0.1:6379> ZRANGE myzset 0 -1
"one"
"two"
"three"
127.0.0.1:6379>
排序
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 xiaoming
(integer) 1
升序排序 从小到大
min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下
使用 ZRANGEBYSCORE 这类命令
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf
"xiaoming"
"xiaohong"
"zhangsan"
升序排序带参数
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores
"xiaoming"
"500"
"xiaohong"
"2500"
"zhangsan"
"5000"
从负无穷到2500进行排序并且附带参数
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores
"xiaoming"
"500"
"xiaohong"
"2500"
降序排序,从大到小
127.0.0.1:6379> ZREVRANGE salary 0 -1
"zhangsan"
"xiaohong"
127.0.0.1:6379> ZREVRANGE salary 0 -1 withscores
"zhangsan"
"5000"
"xiaohong"
"2500"
zrem移除元素
127.0.0.1:6379> ZRANGE salary 0 -1
"xiaoming"
"xiaohong"
"zhangsan"
127.0.0.1:6379> zrem salary xiaoming
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
"xiaohong"
"zhangsan"
获取有序集合中的个数
127.0.0.1:6379> zcard salary
(integer) 2
Redis Zcount 命令用于计算有序集合中指定分数区间的成员数量。
127.0.0.1:6379> zrange salary 0 -1 withscores
1) "xiaohong"
2) "2500"
3) "zhangsan"
4) "5000"
127.0.0.1:6379> ZCOUNT salary 100 2600
(integer) 1
案例思路:set排序,存储班级成绩表,工资表排序
普通消息:1,重要消息:2 带权重进行判断
排行榜应用实现,取Ton N实现