String

使用场景:

1.缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。

2.计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。

3.session:常见方案spring session + redis实现session共享。

hash

hash在实际项目中有可能多表 关联查询,redis怎么存:可以sql先关联起来,然后存到视图,redis存视图里面的数据

package com.huadian.Hash;import com.huadian.redisUntil.JedisPoolUntil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.Map;public class HashDemo {private Jedis jedis = null;@Beforepublic void fun(){jedis = JedisPoolUntil.getJedis();}/*** Redis Hset 命令用于为哈希表中的字段赋值 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,旧值将被覆盖。redis 127.0.0.1:6379> HSET KEY_NAME FIELD VALUE*/@Testpublic void add(){Long hset = jedis.hset("user", "name", "王二");System.out.println(hset);}/*** Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN*/@Testpublic void addMore(){Map<String ,String>map = new HashMap<>();map.put("name","cpf");map.put("position","java");map.put("salary","100");String student = jedis.hmset("student", map);System.out.println(student);}/*** Redis Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。** redis 127.0.0.1:6379> HDEL KEY_NAME FIELD1.. FIELDN*/@Testpublic void del(){Long student = jedis.del("student");System.out.println(student);}/*** Redis Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。** redis 127.0.0.1:6379> HDEL KEY_NAME FIELD1.. FIELDN*/@Testpublic void del1(){Long student = jedis.hdel("student","salary","age");System.out.println(student);}/*** Redis Hincrbyfloat 命令用于为哈希表中的字段值加上指定浮点数增量值。如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。redis 127.0.0.1:6379> HINCRBYFLOAT KEY_NAME FIELD_NAME INCR_BY_NUMBER*/@Testpublic void modify(){Long aLong = jedis.hincrBy("student", "salary", 100);Double aDouble = jedis.hincrByFloat("student", "salary", 100);System.out.println(aDouble);}/*** Redis Hget 命令用于返回哈希表中指定字段的值。** redis 127.0.0.1:6379> HGET KEY_NAME FIELD_NAME */@Testpublic void getMore(){String hget = jedis.hget("student", "salary");System.out.println(hget);}@Afterpublic void fun1(){jedis = JedisPoolUntil.getJedis();}
}

list

排行榜

  list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名、斗鱼年终盛典主播排名等,下图是酷狗音乐“K歌擂台赛”的昨日打擂金曲排行榜,每日计算一次,存储在list类型中,接口访问时,通过page和size分页获取打擂金曲。(打个小广告,酷狗音乐“K歌擂台赛”每天都能产生一批优质翻唱作品,对普通人优质歌声有兴趣的朋友不妨来听听)。

最新列表

  list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。

  但是,并不是所有的最新列表都能用list类型实现,因为对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉,举个例子,当前列表里由表头到表尾依次有(E,D,C,B,A)五个元素,每页获取3个元素,用户第一次获取到(E,D,C)三个元素,然后表头新增了一个元素F,列表变成了(F,E,D,C,B,A),此时用户取第二页拿到(C,B,A),元素C重复了。只有不需要分页(比如每次都只取列表的前5个元素)或者更新频率低(比如每天凌晨更新一次)的列表才适合用list类型实现。对于需要分页并且会频繁更新的列表,需用使用有序集合sorted set类型实现。另外,需要通过时间范围查找的最新列表,list类型也实现不了,也需要通过有序集合sorted set类型实现,如以成交时间范围作为条件来查询的订单列表。之后在介绍有序集合sorted set类型的应用场景时会详细介绍sorted set类型如何实现最新列表。

  那么问题来了,对于排行榜和最新列表两种应用场景,list类型能做到的sorted set类型都能做到,list类型做不到的sorted set类型也能做到,那为什么还要使用list类型去实现排行榜或最新列表呢,直接用sorted set类型不是更好吗?原因是sorted set类型占用的内存容量是list类型的数倍之多(之后会在容量章节详细介绍),对于列表数量不多的情况,可以用sorted set类型来实现,比如上文中举例的打擂金曲排行榜,每天全国只有一份,两种数据类型的内存容量差距可以忽略不计,但是如果要实现某首歌曲的翻唱作品地区排行榜,数百万的歌曲,300多个地区,会产生数量庞大的榜单,或者数量更加庞大的朋友圈点赞列表,就需要慎重地考虑容量的问题了

set(set /sorted set)

set

1. 好友/关注/粉丝/感兴趣的人集合

  set类型唯一的特点使得其适合用于存储好友/关注/粉丝/感兴趣的人集合,集合中的元素数量可能很多,每次全部取出来成本不小,set类型提供了一些很实用的命令用于直接操作这些集合,如

    a. sinter命令可以获得A和B两个用户的共同好友

        b. sismember命令可以判断A是否是B的好友

  c. scard命令可以获取好友数量

  c. 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合

2. 随机展示

  通常,app首页的展示区域有限,但是又不能总是展示固定的内容,一种做法是先确定一批需要展示的内容,再从中随机获取。如下图所示,酷狗音乐K歌擂台赛当日的打擂歌曲共29首,首页随机展示5

3. 黑名单/白名单

  经常有业务出于安全性方面的考虑,需要设置用户黑名单、ip黑名单、设备黑名单等,set类型适合存储这些黑名单数据,sismember命令可用于判断用户、ip、设备是否处于黑名单之中。

首;昨日打擂金曲共200首,首页随机展示30首

redis 不同数据结构使用场景相关推荐

  1. 【高级开发进阶】Redis五大数据结构应用场景落地

    Redis缓存数据结构,数据同步问题(双删策略),缓存雪崩,缓存穿透,热点缓存重构,缓存失效,哨兵机制,持久化,redis 淘汰机制 熟悉掌握Redis数据结构的使用场景,熟悉Redis缓存高并发的使 ...

  2. Redis常用数据结构及其场景归纳

    1 mset.mget.msetnx 批量处理字符串更新.获取.加锁 场景:文章的标题.内容.作者等多个key 批量发布和查看(对于这种可以直接用序列化反序列化..) 2 strlen.getrang ...

  3. php两个数组之间去重,php数组去重、魔术方法、redis常用数据结构及应用场景

    一.用函数对数组进行去重的方法 1. arrau_unique函数的作用 移除数组中重复的值. 将值作为字符串进行排序,然后保留 每个值第一次 出现的健名,健名保留不变. 第二个参数可以选择排序方式: ...

  4. Redis的数据结构及应用场景

    2019独角兽企业重金招聘Python工程师标准>>> 一. 谈谈对redis的理解,它的应用场景. Redis是一个key-value存储系统,它支持存储的value类型包括str ...

  5. Redis五种数据结构应用场景

    文章目录 前言 二.字符串String 2.1.常用操作 2.2.应用场景 2.2.1.单值缓存(最常用) 2.2.2.对象缓存 2.2.3.分布式锁 2.2.4.计数器 三.哈希hash 3.1.常 ...

  6. Redis中数据结构和编码详细图解(应用场景及优缺点)

    专业术语 sds:simple dynamic string 简单动态字符串,redis自己开发的一个字符串的抽象类型 embstr:embedded sds string embstr编码的SDS, ...

  7. 【面试经典】redis 常见数据结构以及使用场景分析

    1.String 常用命令: set,get,decr,incr,mget 等. String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字. 常规key- ...

  8. redis核心数据结构以及他的应用场景

    文章目录 redis核心数据结构 1.string字符串 1.1应用场景 2.hash哈希 2.1应用场景 2.2优缺点 3.list数组列表 3.1应用场景 4.set集合 4.1应用场景 5.zs ...

  9. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

最新文章

  1. 工具类的方法怎么引用_Hutool中那些常用的工具类和方法
  2. React状态管理大乱斗,横向对比Dva,Rematch,Mirror
  3. DevExpress的PdfViewer添加工具栏实现PDF打开、预览、保存、打印
  4. ABAP程序里设置外部断点,调试时断点怎么也触发不了,该怎么办
  5. 比利时女摄影师玛瑞亚
  6. VS Code解决Go相关工具无法安装问题
  7. JavaScriptDom操作与高级应用(八)
  8. window2003 server服务器配置标准
  9. liunx 命令 之 mkdir 与 touch
  10. 简易计算器app的制作
  11. ctfshow 做题 MISC入门 模块 31-40
  12. 单U盘 clonezilla 克隆ubuntu16.04系统
  13. 100base - CX/FX/LX/SX/ZX
  14. 构造Linux的图形化安装程序(4)(转)
  15. 智商黑洞(门萨Mensa测试)11
  16. SQL REGEXP_SUBSTR的用法
  17. 【Python】(2022.07.03)在Jupyter Notebook中调用Stata17并绘制3D图展示回归结果的边际效应
  18. javascript生成二维码
  19. 有时一个眼神就知道对方是不是喜欢你
  20. 2021 各式免費 Sorce Code

热门文章

  1. 深度系统安装php,如何在原有系统中加入功能 深度系统 安装系统 系统还
  2. 用51单片机,keil编程,proteus仿真,实现2位数码管00-99自动计数
  3. 虚拟机网络模式(Bridge,Nat)简介
  4. Java程序员面试笔试宝典-Java基础知识(一)
  5. 实现简单的评论区功能
  6. can`t resolve fs in xlsx-style
  7. Linux——SSH远程管理
  8. 1、non-finite loss, ending training tensor(nan, device=‘cuda:0‘,2、‘LogSoftmaxBackward3、Function ‘MulB
  9. ffmpeg 多个视频先去掉声音合并后,再添加文字与音频
  10. 增强现实(AR)项目实战