连接Redis
$ redis-cli -h host -p port -a password
[root@CentOS src]# ./redis-cli -p 6383
Redis的数据类型
String 字符串
String是最基础的,一个key对应的一个value。
127.0.0.1:6379> set k1 hello
OK
127.0.0.1:6379> get k1
"hello"
127.0.0.1:6379>
String的应用场所
有一种需求:
赞一个、踩一下(计数)。
incr
decr
127.0.0.1:6379> incr sku0001
(integer) 1
127.0.0.1:6379> incr sku0001
(integer) 2
127.0.0.1:6379> incr sku0001
(integer) 3
127.0.0.1:6379> get sku0001
"3"
127.0.0.1:6379>
Hash 哈希
Hash是键值对的集合,相当于java中的Map<String,Map<Object, Object>>
127.0.0.1:6379> hmset hash_value key1 hello key2 world
OK
127.0.0.1:6379> hget hash_value key1
"hello"
127.0.0.1:6379>
Hash的应用场所
简单版本的购物车
127.0.0.1:6379> hset shopcar:user1 sku001 1 # 添加商品sku001到购物车里 数量1
(integer) 1
127.0.0.1:6379> hset shopcar:user1 sku002 1 # 添加商品sku002到购物车里 数量1
(integer) 1
127.0.0.1:6379> hincrby shopcar:user1 sku002 1 # 增加商品sku001的数量
(integer) 2
127.0.0.1:6379> hlen shopcar:user1 # 获取用户商品数量
(integer) 2
127.0.0.1:6379> hgetall shopcar:user1 # 获取所有商品
1) "sku001"
2) "1"
3) "sku002"
4) "2"
List 列表
List是简单的字符串列表,按照插入顺序排序
127.0.0.1:6379> lpush list_value a
(integer) 1
127.0.0.1:6379> lpush list_value b
(integer) 2
127.0.0.1:6379> lpush list_value c
(integer) 3
127.0.0.1:6379> lrange list_value 0 5
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush rlist a1 a2 a3 a1 a5
(integer) 5
127.0.0.1:6379> lrange rlist 0 -1
1) "a1"
2) "a2"
3) "a3"
4) "a1"
5) "a5"
127.0.0.1:6379>
应用场景
订阅公众号,当发布一条文章,就往我的订阅里的文章列表加一条文章的id。
# 用户userid001订阅了CSDN 和 搞笑漫画
127.0.0.1:6379> lpush userid001 1 # 当CSDN发布了一条文章1
(integer) 1
127.0.0.1:6379> lpush userid001 2 # 当搞笑漫画发布了一条文章2
(integer) 2
127.0.0.1:6379> lrange userid001 0 -1 # 获取我的文章列表
1) "2"
2) "1"
127.0.0.1:6379>
Set 集合
Set里的元素是唯一的。以下加了两次banana被忽略。
127.0.0.1:6379> sadd set_value apple
(integer) 1
127.0.0.1:6379> sadd set_value banana
(integer) 1
127.0.0.1:6379> sadd set_value banana
(integer) 0
127.0.0.1:6379> smembers set_value
1) "apple"
2) "banana"
127.0.0.1:6379> scard set_value
(integer) 2
127.0.0.1:6379> spop set_value
"banana"
127.0.0.1:6379> srandmember set_value 2 # 随即抽取【2】个
1) "apple"
2) "banana"
# 集合运算
127.0.0.1:6379> sadd set1 1 3 5 7 9
(integer) 5
127.0.0.1:6379> sadd set2 2 4 6 8 9
(integer) 5
# set1-set2=set1独有的(差集)
127.0.0.1:6379> sdiff set1 set2
1) "1"
2) "3"
3) "5"
4) "7"
# set2-set1=set2独有的
127.0.0.1:6379> sdiff set2 set1
1) "2"
2) "4"
3) "6"
4) "8"
# 交集 既在set1 又在set2的值
127.0.0.1:6379> sinter set1 set2
1) "9"
# union 合在一起
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
应用场景
- 小程序给粉丝抽奖
127.0.0.1:6379> sadd choujiang tom bob alice jim susan
(integer) 5
# pop出中奖的用户的名称
127.0.0.1:6379> spop choujiang # 一等奖弹出一个
"bob"
127.0.0.1:6379> spop choujiang 2 # 二等奖弹出2个
1) "jim"
2) "alice"
127.0.0.1:6379> scard choujiang # 还剩下两个没中奖
(integer) 2
2. 微信朋友圈点赞
步骤:
- 发布了一条朋友圈,id为msg001
- 用户A,B,C,D来点赞
- 用户C取消了点赞
- 用户B看到这条消息是已点赞状态 还是未点赞的状态
127.0.0.1:6379> sadd wechat:good A B C D # 添加ABCD
(integer) 4
127.0.0.1:6379> srem wechat:good C # 移除C的点赞
(integer) 1
127.0.0.1:6379> smembers wechat:good # 还剩下的点赞的用户(头像显示)
1) "D"
2) "B"
3) "A"
127.0.0.1:6379> scard wechat:good # 红色提醒的数字图标
(integer) 3
127.0.0.1:6379> sismember wechat:good B # B用户在不在点赞的列表里
(integer) 1
- 微博社交
127.0.0.1:6379> sadd sis:weibo li wang zhao zheng xiao # 妹妹微博关注的
(integer) 5
127.0.0.1:6379> sadd my:weibo wei zhao wang qian sun # 我微博关注的
(integer) 5
127.0.0.1:6379> sinter sis:weibo my:weibo #共同关注的
1) "wang"
2) "zhao"
127.0.0.1:6379> sdiff sis:weibo my:weibo #我关注的人关注他们(我可能想要关注的)
1) "li"
2) "zheng"
3) "xiao"
#我关注的人也关注妹妹的
127.0.0.1:6379> smembers my:weibo # 循环遍历我关注的人的关注列表,检查我关注的人的关注列表里有没有妹妹sis
1) "zhao"
2) "qian"
3) "wei"
4) "wang"
5) "sun"
127.0.0.1:6379> sismember sis:weibo zhao # zhao的微博有木有关注sis?
(integer) 0
- QQ推荐可能认识的人
sdiff
(我的朋友,他可能认识 and 他的好友,我可能认识) 和sinter
(共同好友)
ZSet 集合
带排序的功能
应用场景
- 商品销售排名
127.0.0.1:6379> zadd product:sell 9 1001
(integer) 1
127.0.0.1:6379> zadd product:sell 15 1002
(integer) 1
127.0.0.1:6379> zincrby product:sell 2 1001
"11"
127.0.0.1:6379> zrange product:sell 0 9
1) "1001"
2) "1002"
127.0.0.1:6379> zrange product:sell 0 9 withscores
1) "1001"
2) "11"
3) "1002"
4) "15"
- 热搜排名