设置、批量设置值
hset h1 f 6
hset h1 e 5
hmset h1 a 1 b 2 c 3 d 4
取值
hget h1 a
批量取值
hmget h1 a b c d
获取所有field
hkeys h1
获取所有field的值
hvals h1
返回哈希表中,所有的字段和值
hgetall h1
删除field
hdel h1 a
获取哈希表中字段的数量
hlen h1
===============================================================
String可以做的事情,Hash都可以做。再补充一个场景,购物车:
key:用户id;field:商品id;value:商品数量;
+1:hincr;
-1:hdecr;
删除:hincrby key field -1;
全选:hgetall;
商品数:hlen;
===============================================================
=============================================================
存储有序的字符串(从左到右),元素可以重复,最大存储数量2^32-1(40亿左右)。
下面通过画图来演示一下入队列,出队列
===============================================================
左推
lpush queue a
lpush queue b c
右推
rpush queue d e
左边移除并返回列表的第一个元素
lpop queue
右边移除并返回列表的第一个元素
rpop queue
通过索引获取列表中的元素
lindex queue 0
返回列表中指定区间内的元素
lrange queue 0 -1
===============================================================
1、列表
例如用户的消息列表、网站的公告列表、活动列表、博客的文章列表、评论列表等,通过 LRANGE 取出一页,按顺序显示。
2、队列/栈
List还可以当做分布式环境的队列/栈使用。
队列:先进先出,rpush 和 blpop
栈:先进后出,rpush 和 brpop
这里介绍两个阻塞的弹出操作:blpop/brpop,可以设置超时时间(单位:秒)。
blpop:blpop key1 timeout,移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpop:brpop key1 timeout,移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
==============================================================
=============================================================
Set 存储 String 类型的无序集合,最大存储数量 2^32-1(40亿左右)。
如下图所示:
===============================================================
添加一个或多个元素
sadd myset a b c d e f g
获取所有元素
smembers myset
统计元素个数
scard myset
随机获取一个元素
srandmember myset
随机弹出一个元素
spop myset
移除一个或者多个元素
srem myset d e f
查看元素是否存在
sismember myset a
获取差集
sdiff set1 set2
获取交集
sinter set1 set2
获取并集
sunion set1 set2
===============================================================
1、抽奖
随机获取元素:spop myset
2、点赞、签到、打卡
我们以微博举例子,假设这条微博的ID是t1001,用户ID是u6001,
用dianzan:t1001来维护t1001这条微博的所有点赞用户。
点赞了这条微博:sadd dianzan:t1001 u6001
取消点赞:srem dianzan:t1001 u6001
是否点赞:sismember dianzan:t1001 u6001
点赞的所有用户:smembers dianzan:t1001
点赞数:scard dianzan:t1001
比关系型数据库简单了许多。
3、商品标签
用 tags:i8001 来维护商品所有的标签。
sadd tags:i8001 画面清晰细腻
sadd tags:i8001 真彩清晰显示屏
sadd tags:i8001 流畅至极
4、商品筛选
华为P40上线了,支持民族品牌,加到各个标签中去。
sadd brand:huawei p40
sadd os:android p40
sadd screensize:6.0-6.24 p40
买的时候筛选,牌子是华为,操作系统是安卓,屏幕大小在6.0-6.24之间的,取交集:
sinter brand:huawei os:android screensize:6.0-6.24
===============================================================
=============================================================
sorted set 存储有序的元素。每个元素都有个 score,按照 score 从小到大排序。score 相同时,按照 key 的ASCII码排序。
===============================================================
添加元素
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
获取全部元素
zrange myset 0 -1 withscores
zrevrange myzset 0 -1 withscores
根据分数区间获取元素
zrangebyscore myzset 20 30
移除元素(也可以根据score rank删除)
zrem myzset php cpp
统计元素个数
zcard myzset
分值增加
zincrby myzset 5 python
根据分值min和max统计个数
zcount myzset 20 60
获取python排名
zrank myzset python
获取元素分数
zscore myzset python
===============================================================
排行榜
今天是2021年5月23号,建一个 key 为 hotSearch:20210523 的 zset。
放羊大叔这条新闻的id是n1234,每点击一下:zincrby hotSearch:20210523 1 n1234
获取热搜排行榜前十条:zrevrange hotSearch:20210523 0 10 withscores
袁老国士无双,一路走好,中华民族的儿女不会忘记您!
==================================================================
=============================================================
BitMaps是在字符串类型上定义地位操作,一个字节由8个二进制位组成。如下图所示:
m的ASCII码是109,对应的二进制数据是0110 1101
===============================================================
设置字符串key为k1,value为mic
set k1 mic
取k1的第七位,结果是0
getbit k1 6
取k1的第八位为0,此时的ASCII码是108,对应字母是l
setbit k1 7 0
所以取出来值为lic
get k1
统计二进制中1的个数,一共是12个
bitcount k1
获取第一个1或者0的位置
bitpos k1 1
bitpos k1 1
===============================================================
-
BITOP AND destkey key [key …],对一个或多个key求逻辑并,并将结果保存到 destkey。
-
BITOP OR destkey key [key …],对一个或多个key求逻辑或,并将结果保存到 destkey。
-
BITOP XOR destkey key [key …],对一个或多个key求逻辑异或,并将结果保存到 destkey。
-
BITOP NOT destkey key,对给定key求逻辑非,并将结果保存到 destkey。
连续七天在线用户
setbit firstday 0 1 //设置第一天uid是0的用户登录
setbit firstday 1 0 //设置第一天uid是1的用户未登录
setbit firstday 2 1 //设置第一天uid是2的用户登录
…
setbit secondday 0 0 //设置第二天uid是0的用户未登录
setbit secondday 1 1 //设置第二天uid是1的用户登录
setbit secondday 2 1 //设置第二天uid是2的用户登录
… //以此类推
那么在算连续七天在线用户就是:
BITOP AND 7_both_online_users firstday secondday thirdday fourthday fifthday sixthday seventhday
还可以应用访问统计、在线用户统计等等。
======================================================================
Hyperloglog 提供了一种不太精确的基数统计方法,用来统计一个集合中不重复的元素个数,比如统计网站的UV,或者应用的日活、月活,存在一定的误差。
在 Redis 中实现的 Hyperloglog,只需要12k内存就能统计2^64个数据。
public static void main(String[] args) {
Jedis jedis = new Jedis(“39.103.144.86”, 6379);
float size = 100000;
for (int i = 0; i < size; i++) {
jedis.pfadd(“hll”, “hll-” + i);
}
long total = jedis.pfcount(“hll”);
System.out.println(String.format(“统计个数: %s”, total));
System.out.println(String.format(“正确率: %s”, (total / size)));
System.out.println(String.format(“误差率: %s”, 1 - (total / size)));
jedis.close();
}
源码在:
com/xhj/jedis/HyperLogLogTest.java
==============================================================
现在有这样一个需求,获取半径1公里以内的门店,那么我们就要把门店的经纬度存起来,如果存在数据库的话,一个字段存经度,一个字段存维度,计算距离比较复杂。现在我们通过 Redis 的 Geo 存储十分方便。
存经纬度
geoadd location 121.445 31.213 shanghai
独家面经总结,超级精彩
本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
com/xhj/jedis/HyperLogLogTest.java
==============================================================
现在有这样一个需求,获取半径1公里以内的门店,那么我们就要把门店的经纬度存起来,如果存在数据库的话,一个字段存经度,一个字段存维度,计算距离比较复杂。现在我们通过 Redis 的 Geo 存储十分方便。
存经纬度
geoadd location 121.445 31.213 shanghai
独家面经总结,超级精彩
本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!
[外链图片转存中…(img-9XLCggmU-1714440194924)]
[外链图片转存中…(img-wxsb3ZwN-1714440194925)]
[外链图片转存中…(img-3bBQXqWX-1714440194925)]
[外链图片转存中…(img-VckIoXKv-1714440194925)]
Java面试准备
准确的说这里又分为两部分:
- Java刷题
- 算法刷题
Java刷题:此份文档详细记录了千道面试题与详解;
[外链图片转存中…(img-NrIet8z9-1714440194925)]
[外链图片转存中…(img-CxgSNs3t-1714440194926)]