浅谈redis五大数据结构和使用场景


Posted in Redis onApril 12, 2021

老规矩,先抛结论后验证

浅谈redis五大数据结构和使用场景

string:有点像java的hashMap,存的时候什么key,取的时候也什么key,常用于做缓存,保存用户信息、查询列表等;
hash:这个有点像hashMap的value又套了个hashMap,下文有举例,一看就明白了;
list:有序列表,类似Java的linkedList,可以在左边右边插入数据;
set:去重集合,类似Java的hashset,可用于求交集,比如共同好友;
zset:带权重的set集合,可用于做排行榜;

为了方便理解,我们基于这个dog类来做测试,有手就能学会的那种

//Dog类,属性不重要,随便写的
public class Dog {
    private String name;
    private String like;
}
================分割线================
//new三只小狗
Dog dog1 = new Dog("蔡徐鸡", "唱跳");
Dog dog2 = new Dog("蔡徐公鸡", "rap");
Dog dog3 = new Dog("蔡徐老母鸡", "篮球");

================分割线================
//我们用jedis来操作redis
Jedis jedis = new Jedis();

1、String:

说明:有点像java的hashMap,存的时候什么key,取的时候也什么key,常用于做缓存,保存用户信息、查询列表等;
操作:set方法,第一个参数是key,第二个参数是value;

浅谈redis五大数据结构和使用场景

key可以随便设置,方便后面对比,我们这里设置key为“string”,value就是dog

//set
jedis.set("string",dog1.toString());
//get
jedis.get("string");

看下它在redis中长什么样 (左边很多db,这个不用管,看db0就行)

浅谈redis五大数据结构和使用场景

如果有多个相同的key,前面的会被覆盖掉

jedis.set("string",dog1.toString());
jedis.set("string",dog2.toString());
jedis.set("string",dog3.toString());

浅谈redis五大数据结构和使用场景

2、hash

说明:hashMap的value又套了个hashMap;
操作:hset方法,第一个参数是key,第二个参数是field,第三个参数是value

浅谈redis五大数据结构和使用场景
我还没想到怎么比较好的解释这个field,说多了怕误导你们,反正这个就像你new了个hashMap,然后这个hashMap的value又是个hashMap,然后你真正的数据是存在第二个hashMap里面的

//类似redis的key
HashMap<Object, Object> key = new HashMap<>();
key.put("key",dog1);
//类似redis的field,这才是redis的hash类型真正存放数据的
HashMap<Object, Object> field = new HashMap<>();
key.put("field",field);

还没懂的话就往下面看,别纠结上面那个举例,我也不知道那样说合理不合理

jedis.hset("hash", "field1", dog1.toString());
jedis.hset("hash", "field2", dog2.toString());
jedis.hset("hash", "field3", dog3.toString());

看下在redis中长什么样

浅谈redis五大数据结构和使用场景

再看下hash类型在jedis中的方法应该就懂了

浅谈redis五大数据结构和使用场景

hget会让你输入两个参数,第一个是key,第二个是field,这个方法直接返回的是dog对象;
而hgetAll只需要输入一个参数,然后返回一个map给你,这个map里面装的全是狗,懂了吧,如果你要获取具体的dog对象,你还的输入一个key,这个key就是那个field;

Map<String, String> dogMap= jedis.hgetAll("hash");
System.out.println(dogMap);
//下面是打印出来的map
{field1=Dog(name=蔡徐鸡, like=唱跳), 
 field3=Dog(name=蔡徐老母鸡, like=篮球),
 field2=Dog(name=蔡徐公鸡, like=rap)}
-----------------------------分割线-------------------------------------
String dog= jedis.hget("hash", "field1");
System.out.println(dog);
//下面是打印出来的dog
Dog(name=蔡徐鸡, like=唱跳)

list

说明:有序列表,类似Java的linkedList,可以在左边右边插入数据;
操作:左插入lpush、右插入rpush

我们先插入一条蔡徐鸡

jedis.lpush("list",dog1.toString());

浅谈redis五大数据结构和使用场景

然后在蔡徐鸡的左右两边各插一条数据,

jedis.rpush("list",dog2.toString());//蔡徐公鸡
jedis.lpush("list",dog3.toString());//蔡徐老母鸡

仔细看下面的顺序

浅谈redis五大数据结构和使用场景

set

说明:去重集合,类似Java的set,可用于求交集,比如共同好友;
操作:放入元素sadd,求set的交集sinterstore,sinterstore方法可以有多个参数,因为这个方法会在redis生成一个set,用来存放交集,所以第一个参数是新生成set的名字,后面的参数全都是指定哪些set加入求交集方法

我们先设置两个set,第一个set存放dog1和dog2,第二个set存放dog2和dog3

jedis.sadd("set1",dog1.toString(),dog2.toString());
jedis.sadd("set2",dog2.toString(),dog3.toString());

浅谈redis五大数据结构和使用场景
浅谈redis五大数据结构和使用场景

我们再往set1里面放个dog1试试

jedis.sadd("set1",dog1.toString());

再看看redis的set1里面有几个dog1,既然是set,肯定不允许放入重复数据,所以应该跟上面一样

浅谈redis五大数据结构和使用场景

我们再来看看如何获取set的交集

目前set1里面有蔡徐鸡和蔡徐公鸡,set2里面有蔡徐公鸡和蔡徐老母鸡,那交集就是蔡徐公鸡,来看看是不是

//这个方法会在redis生成一个set,用来存放交集
//第一个参数是指定新生成set的名字,后面的参数全都是指定哪些set加入求交集方法
jedis.sinterstore("set","set1","set2");

来看下reids中有没有生成一个叫set的key
浅谈redis五大数据结构和使用场景

可以看到redis生成了一个名叫set的key,并且它的值是set1和set2的交集,大名鼎鼎的蔡徐公鸡~~

zset

说明:带权重的set集合,可用于做排行榜;
操作:添加元素zadd,需要指定元素的权重

jedis.zadd("zset", 100, dog1.toString());//权重为100的dog1
jedis.zadd("zset", 200, dog2.toString());//权重为200的dog2
jedis.zadd("zset", 300, dog3.toString());//权重为300的dog3

看看redis中的zset是否按照权重排列

浅谈redis五大数据结构和使用场景

of course!!

说明:以上操作redis的方法仅作为理解redis数据类型举例,实际上每个数据类型都还有很多很多其它方法,具体的本文不展开叙述,其次,我们生产中使用redis时,一定要记得给key设置过期时间,除开一些需要对key做持久化的场景,因为redis是运行在内存中的,如果所有key都持久存在于内存,你服务器顶不住的鸭!!!

到此这篇关于浅谈redis五大数据结构和使用场景的文章就介绍到这了,更多相关redis 数据结构和使用场景内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis限流的实际应用
Apr 24 Redis
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
Redis 哨兵集群的实现
Jun 18 Redis
浅谈Redis中的RDB快照
Jun 29 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 Redis
redis 解决库存并发问题实现数量控制
Apr 08 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
解决redis sentinel 频繁主备切换的问题
redis连接被拒绝的解决方案
Redis如何一键部署脚本
Redis遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 #Redis
redis配置文件中常用配置详解
Apr 14 #Redis
Redis安装启动及常见数据类型
redis限流的实际应用
Apr 24 #Redis
You might like
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
JS 建立对象的方法
2007/04/21 Javascript
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
python爬取内容存入Excel实例
2019/02/20 Python
Python PO设计模式的具体使用
2019/08/16 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
总会计师岗位职责
2014/02/19 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书