Redis不只是get set,八种数据类型及应用场景分析

设置、批量设置值

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都可以做。再补充一个场景,购物车:

image.png

key:用户id;field:商品id;value:商品数量;

+1:hincr;

-1:hdecr;

删除:hincrby key field -1;

全选:hgetall;

商品数:hlen;

List

===============================================================

介绍

=============================================================

存储有序的字符串(从左到右),元素可以重复,最大存储数量2^32-1(40亿左右)。

下面通过画图来演示一下入队列,出队列

image.png

操作命令

===============================================================

左推

lpush queue a

lpush queue b c

右推

rpush queue d e

左边移除并返回列表的第一个元素

lpop queue

右边移除并返回列表的第一个元素

rpop queue

通过索引获取列表中的元素

lindex queue 0

返回列表中指定区间内的元素

lrange queue 0 -1

应用场景

===============================================================

1、列表

例如用户的消息列表、网站的公告列表、活动列表、博客的文章列表、评论列表等,通过 LRANGE 取出一页,按顺序显示。

Redis不只是get set,八种数据类型及应用场景分析

2、队列/栈

List还可以当做分布式环境的队列/栈使用。

队列:先进先出,rpush 和 blpop

栈:先进后出,rpush 和 brpop

这里介绍两个阻塞的弹出操作:blpop/brpop,可以设置超时时间(单位:秒)。

blpop:blpop key1 timeout,移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

brpop:brpop key1 timeout,移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

Set

==============================================================

介绍

=============================================================

Set 存储 String 类型的无序集合,最大存储数量 2^32-1(40亿左右)。

如下图所示:

image.png

操作命令

===============================================================

添加一个或多个元素

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、点赞、签到、打卡

image.png

我们以微博举例子,假设这条微博的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 来维护商品所有的标签。

Redis不只是get set,八种数据类型及应用场景分析

sadd tags:i8001 画面清晰细腻

sadd tags:i8001 真彩清晰显示屏

sadd tags:i8001 流畅至极

4、商品筛选

image.png

华为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

ZSet

===============================================================

介绍

=============================================================

sorted set 存储有序的元素。每个元素都有个 score,按照 score 从小到大排序。score 相同时,按照 key 的ASCII码排序。

image.png

操作命令

===============================================================

添加元素

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

应用场景

===============================================================

排行榜

image.png

今天是2021年5月23号,建一个 key 为 hotSearch:20210523 的 zset。

放羊大叔这条新闻的id是n1234,每点击一下:zincrby hotSearch:20210523 1 n1234

获取热搜排行榜前十条:zrevrange hotSearch:20210523 0 10 withscores

袁老国士无双,一路走好,中华民族的儿女不会忘记您!

BitMaps

==================================================================

介绍

=============================================================

BitMaps是在字符串类型上定义地位操作,一个字节由8个二进制位组成。如下图所示:

Redis不只是get set,八种数据类型及应用场景分析

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

======================================================================

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

Geo

==============================================================

现在有这样一个需求,获取半径1公里以内的门店,那么我们就要把门店的经纬度存起来,如果存在数据库的话,一个字段存经度,一个字段存维度,计算距离比较复杂。现在我们通过 Redis 的 Geo 存储十分方便。

存经纬度

geoadd location 121.445 31.213 shanghai

独家面经总结,超级精彩

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

image

image

image

image

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

image

image

com/xhj/jedis/HyperLogLogTest.java

Geo

==============================================================

现在有这样一个需求,获取半径1公里以内的门店,那么我们就要把门店的经纬度存起来,如果存在数据库的话,一个字段存经度,一个字段存维度,计算距离比较复杂。现在我们通过 Redis 的 Geo 存储十分方便。

存经纬度

geoadd location 121.445 31.213 shanghai

独家面经总结,超级精彩

本人面试腾讯,阿里,百度等企业总结下来的面试经历,都是真实的,分享给大家!

[外链图片转存中…(img-9XLCggmU-1714440194924)]

[外链图片转存中…(img-wxsb3ZwN-1714440194925)]

[外链图片转存中…(img-3bBQXqWX-1714440194925)]

[外链图片转存中…(img-VckIoXKv-1714440194925)]

Java面试准备

准确的说这里又分为两部分:

  1. Java刷题
  2. 算法刷题

Java刷题:此份文档详细记录了千道面试题与详解;

[外链图片转存中…(img-NrIet8z9-1714440194925)]

[外链图片转存中…(img-CxgSNs3t-1714440194926)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值