Redis基本数据类型及常用命令
String类型
- set name he
append name llo 追加字符串,如果不存在就新建
get name -->hello - 获取字符串的长度strlen name
- incr key 将key的值加一,减一用decr,只能操作字符串类型数值
- INCRBY key 10/DECRBY key 5 可设置步长的一次性加减
- GETRANGE name 0 3 按照范围截取字符串 0 -1 获取全部字符串
- key2 abcdefg SETRANGE key2 1 xx ; get key2 axxdefg
- setex(set with expire) #设置过期时间 setex key3 30 “hello”
- setnx(set if not exist) #key不存在的时候再设置,如果存在则返回0创建失败。
- 批量设置值 mset k1 v1 k2 v2 k3 v3
- 如果库中存在k1 k2 k3则设置 msetnx k1 vx k4 v4 则k1和k4都不能设置成功,这个操作是原子性操作,要么一起成功要么一起失败,分布式锁用的比较多。
- key设计技巧:对象:set user:1 {name:zhangsan,age:3} 设置一个user:1对象 值为json字符来保存一个对象!这里的key是一个巧妙的设计:user:{id} {filed},如此设计在redis中完全是OK了。比如设置文章浏览量 set article:10000:views 0
- getset db redis 如果存在值,获取原来的值,并设置新的值
String类似的使用场景:value除了是我们的字符串还可以是我们的数字!
- 计数器
- 统计多单位的数量 uid:95256449:follow 0
- 粉丝数
- 对象缓存存储
List列表类型详解
在redis里面,我们可以把list玩成,栈、队列、阻塞队列!
127.0.0.1:6379> LPUSH l one
(integer) 1
127.0.0.1:6379> LPUSH l two
(integer) 2
127.0.0.1:6379> LPUSH l three
(integer) 3
127.0.0.1:6379> LRANGE l 0 -1
1) “three”
2) “two”
3) “one”
127.0.0.1:6379> LRANGE l 0 0
1) “three”
127.0.0.1:6379> LRANGE l 0 0
1) “three”
-
LPUSH:将一个值或者多个值,插入到列表头部(左) 例:LPUSH list 1
RPUSH: 将一个值或者多个值,插入到列表尾部(右) -
LPOP:从左边移除 例:LPOP list
RPOP:从右边移除 -
lindex list 0: 通过下标获取list中的某一个值
Llen list: 返回列表的长度 -
lrem list 1 one #移除list集合中指定个数的value,精确匹配
-
ltrim mylist 1 2 通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素!
-
rpoplpush mylist myotherlist #移除列表的最后一个元素,将他移动到新的列表中
-
lset list 0 item 把索引为0的元素替换为item
-
LINSERT list before/after “world” "other"在list指定位置之前/之后插入元素
list实际上就是一个链表,如果key不存在,创建新的链表,如果key存在,在链表中插入元素,如果移除了所有值,空链表也代表不存在。在两边插入效率最高,中间元素,相对来说效率会低一点!
消息排队!消息队列!左输入,右弹出是队列。左输入,右弹出是栈。
Set集合类型详解
- 基本命令 sadd和smembers
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> sadd myset geng
(integer) 1
127.0.0.1:6379> smembers myset #查看指定set的所有值
1) “geng”
2) “world”
3) “hello”
127.0.0.1:6379> sadd myset geng
(integer) 0
127.0.0.1:6379> smembers myset
1) “geng”
2) “world”
3) “hello”
127.0.0.1:6379> SISMEMBER myset hello #查看集合中是否有元素
(integer) 1
127.0.0.1:6379> SISMEMBER myset world
(integer) 1
127.0.0.1:6379> SISMEMBER myset wor
(integer) 0
127.0.0.1:6379> smembers myset
1) “geng”
2) “world”
3) “hello”
127.0.0.1:6379> scard myset #查看set集合中元素的个数
(integer) 3
127.0.0.1:6379> sadd myset good
(integer) 1
127.0.0.1:6379> scard myset
(integer) 4
127.0.0.1:6379> scard myset
(integer) 4
127.0.0.1:6379> srem myset good #从set集合中移除指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> smembers myset
1) “geng”
2) “world”
3) “hello”
127.0.0.1:6379> srandmember myset #从set集合中随机获取值
“hello”
127.0.0.1:6379> srandmember myset
“geng”
127.0.0.1:6379> srandmember myset
“geng”
127.0.0.1:6379> srandmember myset 2
1) “geng”
2) “hello”
- 删除指定的key、删除随机的key
127.0.0.1:6379> smembers myset
1) “geng”
2) “world”
3) “hello”
127.0.0.1:6379> spop myset #随机删除pop
“hello”
127.0.0.1:6379> spop myset
“geng”
127.0.0.1:6379> smembers myset
1) “world”
- 将一个指定的值,移动到另外一个set集合
smove myset1 myset2 “hello”
- 微博、B站、共同关注!(并集)
数字集合类:
- 差集
- 交集
- 并集
127.0.0.1:6379> sadd k1 a
(integer) 1
127.0.0.1:6379> sadd k1 b
(integer) 1
127.0.0.1:6379> sadd k1 c
(integer) 1
127.0.0.1:6379> sadd k2 c
(integer) 1
127.0.0.1:6379> sadd k2 d
(integer) 1
127.0.0.1:6379> sadd k2 e
(integer) 1
127.0.0.1:6379> SDIFF k1 k2 #差集
1) “b”
2) “a”
127.0.0.1:6379> SINTER k1 k2 #交集
1) “c”
127.0.0.1:6379> SUNION k1 k2 #并集
1) “e”
2) “c”
3) “a”
4) “b”
5) “d”
微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)
Hash哈希类型详解
Map集合,key-map!的时候这个值是一个map集合!本质和String类型没有太大区别,还是一个简单的key-value!
1.
127.0.0.1:6379> hset myhash field1 value1 #set一个具体key-value
(integer) 1
127.0.0.1:6379> hset myhash field2 value2
(integer) 1
127.0.0.1:6379> hset myhash field3 value3
(integer) 1
127.0.0.1:6379> hmset myhash key1 val1 key2 val2 key3 val3 #set多个 key-value
OK
127.0.0.1:6379> hget myhash field1
“value1”
127.0.0.1:6379> hget myhash key2
“val2”
127.0.0.1:6379> hgetall myhash #获取全部的key、value
1) “field1”
2) “value1”
3) “field2”
4) “value2”
5) “field3”
6) “value3”
7) “key1”
8) “val1”
9) “key2”
10) “val2”
11) “key3”
12) “val3”
127.0.0.1:6379> hgetall myhash
1) “field1”
2) “value1”
3) “field2”
4) “value2”
5) “field3”
6) “value3”
7) “key1”
8) “val1”
9) “key2”
10) “val2”
11) “key3”
12) “val3”
127.0.0.1:6379> hdel myhash key3 key2 #删除hash指定key字段!对应的value值也就消失了!
(integer) 2
127.0.0.1:6379> hgetall myhash
1) “field1”
2) “value1”
3) “field2”
4) “value2”
5) “field3”
6) “value3”
7) “key1”
8) “val1”
127.0.0.1:6379> hgetall myhash
1) “field1”
2) “value1”
3) “field2”
4) “value2”
5) “field3”
6) “value3”
7) “key1”
8) “val1”
127.0.0.1:6379> hlen myhash #获取myhash的长度
(integer) 4
127.0.0.1:6379> HEXISTS myhash field1 #判断hash中指定字段是否存在!
(integer) 1
127.0.0.1:6379> HEXISTS myhash field5
(integer) 0
127.0.0.1:6379> hkeys myhash #获取myhash中所有的key
1) “field1”
2) “field2”
3) “field3”
4) “key1”
127.0.0.1:6379> hvals myhash #获取myhash中所有的value
1) “value1”
2) “value2”
3) “value3”
4) “val1”
Zset有序集合类型详解
在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1
1.
127.0.0.1:6379> zadd myset 1 one
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) “one”
2) “two”
3) “three”
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 kuangshen
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #按照从小到大的顺序排序
1) “kuangshen”
2) “xiaohong”
3) “zhangsan”
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores #显示全部的用户并且附带成绩
1) “kuangshen”
2) “500”
3) “xiaohong”
4) “2500”
5) “zhangsan”
6) “5000”
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #显示工资小于等于2500员工的降序排列
1) “kuangshen”
2) “500”
3) “xiaohong”
4) “2500”
127.0.0.1:6379> zrange salary 0 -1
1) “kuangshen”
2) “xiaohong”
3) “zhangsan”
127.0.0.1:6379> zrem salary xiaohong #有序集合移除元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) “kuangshen”
2) “zhangsan”
127.0.0.1:6379> zcard salary #获取有序集合中的个数
(integer) 2
- 案例思路:set 排序 存储班级成绩表,工资表排序。普通消息,1,重要消息,2。排行榜应用实现,取TOP N测试!