Redis基本数据结构及应用案例

一 :Redis 简介

redis 是目前最受欢迎的NoSql 数据库,是以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。

redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,此特性保证了数据的持久化。

今天主要简单的介绍下 redis的五种数据结构及其简单运用。
redis.png

二 :String 结构与应用场景

1、单值缓存

set key value
get key
单值存储.png

2、对象缓存

mset key value [key value …]
mget key [key …]
对象存储.png

3、分布式锁

setnx key value [set if not exists]
key 不存在时,设置成功,返回 1,key 存在则不做任何操作 返回0
比如对一个商品 Logitech:gpw 进行加锁,因为redis 是单线程的,只有一个加锁成功,其他返回加锁失败,操作如下:
分布式锁.png

4、web集群session 共享

使用spring session + redis 实现 session 共享

5、计数器

incr key
应用场景 :
    ①:如右图的阅读数
    ②:对于自增需要的处理
计数器.png
阅读案例.png

    @Autowired
    private RedisTemplate redisTemplate;


/**
     * TS+日期+4位数字
     *
     * @return
     */
    public String getComplaintCode() {
        SimpleDateFormat dfst = new SimpleDateFormat("yyyyMMdd");
        String newDate = dfst.format(new Date());
        String complaintCode = "";
        Long incr = this.incr("complaintRepair" + newDate, 24);
        if (incr == 0) {
            incr = this.incr("complaintRepair" + newDate, 24);
        }
        DecimalFormat df = new DecimalFormat("0000");
        complaintCode = "TS" + newDate + df.format(incr);
        return complaintCode;
    }

    public Long incr(String key, long liveTime) {
        RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        Long increment = entityIdCounter.getAndIncrement();
        if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
            entityIdCounter.expire(liveTime, TimeUnit.HOURS);
        }
        return increment;
    }

三 :Hash 结构与应用场景

1、单值缓存

    hset key field value 
    hset key field 
单值缓存.png

2、对象缓存

    hmset key field value [field value ...]
    hmget key field [field ...]
对象缓存.png

3、举例说明

工作中很少用hset ,就举例说明:下图主要信息有 :购物车商品数量,购物车单个商品id及数量,可以全选商品,增加数量,删除商品等操作,具体如下
购物车.png
购物车 :
①:以用户id 为key
②:商品id 为field
③:商品数量为value

购物车操作 :
①:添加商品  hset wangch:7456 bose:1 1
②:增加数量  hincrby wangch:7456 bose:1 1
③:商品总数  hlen wangch:7456
④:删除商品  hdel wangch:7456 bose:1    
⑤:获取购物车所有商品  hgetall wangch:7456
购物车操作.png

4、hash 结构的优缺点

优点 :
①:同类数据归类整合存储,方便数据管理
②:相比于string操作内存和cpu更小
③:相比于string存储更节省空间

缺点 :
①:过期功能不能使用在field上,只能使用在key上
②:redis集群架构下不适合大规模使用
集群示例.png

四 :List 结构与应用场景

1、基础命令

lpush key value [value …]
value值 从左到右的顺序依次插入到表头   
rpush key value [value ...]
value值 从右到左的顺序依次插入到表头   
lpop key
移除并返回列表 key 的头元素
rpop key
移除并返回列表 key 的尾元素

lrange key start stop
返回列表key 指定区间内元素,区间以偏移量start和stop指定

blpop key [key …] timeout
从key列表表头弹出一个元素,若列表没有元素,阻塞等待timeout秒,如果timeout=0 ,一直等待下去


brpop key [key …] timeout
从key列表表尾弹出一个元素,若列表没有元素,阻塞等待timeout秒,如果timeout=0 ,一直等待下去
List操作示例.png

2、常用数据结构

Stack(栈)=lpush + lpop (先进后出)
栈操作.png
Queue(队列)=lpush + rpop (先进先出)
队列操作.png
Blocking MQ (阻塞队列)=lpush + brpop
会话一阻塞.png

会话二新增数据.png
会话一获取数据.png

3、微信公众号消息流

①:Java3y 推送消息,消息id为 222
        lpush msg:wangch 222

②:Hollis 推送消息,消息id为 444
        lpush msg:wangch 444

③:查看最新的公众号消息
        lrange msg:wangch 0 4
公众号示例.png
操作示例.png
此种方式适用于粉丝量小的公众号推送方式

五 :Set 结构与应用场景

1、set 常用操作

sadd key member [member]   新增元素 ,  元素唯一不重复
srem key member [member]   删除元素
smembers key               获取集合key 所有元素
scard key                  获取集合key 元素个数
sismember key member       判断元素是否存在于集合key
srandmember key [count]    从集合key中取出count个元素,元素不删除
spop key [count]           从集合key中取出count个元素,元素删除

2、应用实例 :微信抽奖小程序

①:点击参与抽奖加入集合
    sadd key wangch
②:查看参与抽奖所有用户
    smembers key
    (scard key : 查看抽奖个数)
③:抽取count 名中奖者
    srandmember key [count]/ spop key [count]
    
(也可以用于点赞,收藏等场景)
抽奖.png

抽奖示例.png

3、set 运算操作

sinter key [key …]              交集运算
sunion key [key …]              并集运算
sdiff key [key …]               差集运算    
举例说明.png
sinter set2 set3 set3 --> {c}
sunion set2 set3 set3 --> {a,b,c,d,e}
sdiff set2 set3 set3 --> {a}

4 、应用实例 :集合操作实现关注模型

①:wangch关注的人
    sadd wangch zhangxh、lisi、wangwu 
②:小明关注的人
    sadd xiaom  lisi、 wangwu、zhaol
③: 李四关注的人
    sadd lisi  xiaom 、zhaol、 xiaoq
获取 wangch 和小明的共同关注
    sinter wangch xiaom --> {lisi、wangwu}
我关注的人也关注了他(小明)
     sismember lisi xiaom --> 返回 1 存在,
                                    则也关注了
我可能认识的人
    sdiff wangch xiaom --> {zhangxh}
关注.png

操作示例.png
可用于淘宝推荐商品:共同关注的人越多,说明兴趣爱好相同。当A购买一件商品时,就可能给你也推荐

六 : ZSet 结构与应用场景

1、ZSet 常用操作

sadd key score member [[scoremember] …]     有序集合key加入带分值元素
srem key member [member]                    有序集合删除元素
zscore key member                           返回有序集合key中元素member分值
zcard key                                   有序集合key中的元素个数
zrange key start stop [withscores]          正序获取key从start下标到stop下标元素
zrevrange key start stop [withscores]       倒序获取key从start下标到stop下标元素

2、 ZSet 集合操作

zunionstore destkey numkeys key  [key...]   并集操作
zinterstore destkey numkeys key  [key...]     交集操作
ZSet.png

3、 ZSet 实现微博排行榜

实现基础 : zset 数据会根据score自动排序,我们将点击次数作为zset ,随着用户点击实时变化
①:展示当日排行前十 (按照score倒序)
    zrevrange hot:20201229 0 9 withscores
②:累计计算近七日点击次数   
    zunionstore hot:20201222-2021229 7hot:20201222 hot:20201223 … hot:2021229
③:展示七日排行前十
     zrevrange hot:20201222-2021229  0 9 withscores
微博热搜.png

4、 ZSet 其他应用

zset 还可以用来实现延迟队列、接口限流等操作,主要是使用score 的特性,以时间戳作为score,来达到相应逻辑。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容