redis 所支持的数据类型以及其应用场景
mhr18 2024-10-31 13:27 20 浏览 0 评论
1.支持的数据类型
redis 支持 String、hash、list、set、Sort set这几种数据类型,可用于缓存、事件发布订阅、高速队列等场景。
String是最常用的数据类型,它能够存储任何类型的字符串,当然也包括二进制、JSON化的对象、甚至是base64编码之后的图片。在Redis中一个字符串最大的容量为512MB。
Hash常用作存储结构化数据、比如论坛系统中可以用来存储用户的Id、昵称、头像、积分等信息。如果需要修改其中的信息,只需要通过Key取出Value进行反序列化修改某一项的值,再序列化存储到Redis中,Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在String结构里是不存在的。
List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。另外,可以利用 lrange 命令,做基于 Redis 的分页功能,性能极佳,用户体验好。
set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,这个时候就可以选择使用set。
可以按照某个条件的权重进行排序,比如可以通过点击数做出排行榜的数据应用。
2 String 常用命令
2.1赋值与取值
SET key value
GET key
2.2 向尾部追加值
APPEND key value
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于SET key value。返回值是追加后字符串的总长度。
2.3 获取字符串长度
STRLEN key
STRLEN命令返回键值的长度,如果键不存在则返回0。
2.4 同时设置/获取多个键值
MSET key value [key value …]
MGET key [key …]
2.5 删除key的值
del key
2.6 判断key否存在
exists key
2.7 若key不存在,则存储
setnx key
2.8 设置key的有效期,并存储数据
setex key 时间(seconds) 新value
2.9 getrange 截取value
GETRANGE KEY_NAME start end
3 hash 常用命令
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。
3.1 赋值与取值
HSET key field value 一次只能设置一个字段值
HGET key field 一次只能获取一个字段值
HMSET key field value [field value ...] 一次可以设置多个字段值
HMGET key field [field ...] 一次可以获取多个字段值
HGETALL key
3.2 判断字段是否存在
HEXISTS key field
当字段不存在时赋值,类似HSET,区别在于如果字段已经存在,该命令不执行任何操作。
3.3 只获取字段名或字段值
HKEYS key
HVALS key
3.4 获取字段数量
HLEN key
3.5 jedis的简单应用
public static void testHash() {
Jedis jedis = RedisUtil.getJedis();
try {
Map<String, String> student = new HashMap<String, String>();
pairs.put("name", "zhangsan");
pairs.put("age", "10");
pairs.put("sex", "Female");
jedis.hmset("test", student)
List<String> name = jedis.hmget("student", "name");// 结果是个泛型的LIST
System.out.println(name);
jedis.hdel("student","age"); //删除map中的某个键值
System.out.println(jedis.hmget("student", "age")); // 因为删除了,所以返回的是null
System.out.println(jedis.hlen("student")); // 返回key为user的键中存放的值的个数
System.out.println(jedis.exists("student"));// 是否存在key为user的记录
System.out.println(jedis.hkeys("student));// 返回map对象中的所有key
System.out.println(jedis.hvals("student"));// 返回map对象中的所有value
Iterator<String> iter = jedis.hkeys("student").iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + ":" + jedis.hmget("student", key));
}
System.out.println(jedis.hkeys("student"));
System.out.println(jedis.hvals("student"));
System.out.println(jedis.hgetAll("student"));
// 清空数据
System.out.println(jedis.flushDB());
// 添加数据
jedis.hset("student2", "key", "value");
jedis.hset("student2", "key1", "value1");
jedis.hset("student2", "key2", "value2");
// 判断某个值是否存在
System.out.println(jedis.hexists("student2", "key"));
// 获取指定的值
System.out.println(jedis.hget("student2", "key")); // 批量获取指定的值
System.out.println(jedis.hmget("student2", "key", "key1"));
// 删除指定的值
System.out.println(jedis.hdel("student2", "key"));
// 为key中的域 field 的值加上增量 increment
System.out.println(jedis.hincrBy("student2", "key", 123l));
// 获取所有的keys
System.out.println(jedis.hkeys("student2"));
// 获取所有的values
System.out.println(jedis.hvals("student2"));
} catch (Exception e) {
e.printStackTrace();
} finally {
RedisUtil.getPool().returnResource(jedis);
}
}
4 list 常用命令
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
4.1 向列表两端增加元素
LPUSH key value [value ...]
RPUSH key value [value ...]
4.2 从列表两端移除元素
LPOP key
RPOP key
4.3 获取列表中元素的个数
LLEN key
4.4 获取列表片段
LRANGE key start stop
4.5 将一个元素从一个列表转移到另一个列表中
RPOPLPUSH source destination
移动的元素遵循被移除列表的先进先出原则
4.6 删除
LTRIM KEY_NAME START STOP
5 set 常用命令
在集合中的每个元素都是不同的,且没有顺序。
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)。
Redis还提供了多个集合之间的交集、并集、差集的运算。
5.1 增加/删除元素
SADD key member [member ...]
SREM key member [member ...]
5.2 获取集合中所有的元素
SMEMBERS key
判断元素是否在集合中,无论集合中有多少元素都可以极速的返回结果。
SISMEMBER key member
6 sorted set
在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
在某些方面有序集合和列表类型有些相似。
1、二者都是有序的。
2、二者都可以获得某一范围的元素。
但是,二者有着很大区别:
1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
2、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
4、有序集合要比列表类型更耗内存。
6.1 增加元素
向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
ZADD key score member [score member ...]
6.2 获取元素的分数
ZSCORE key member
6.3 获得排名在某个范围的元素列表
元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
ZRANGE key start stop [WITHSCORES]
元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
ZREVRANGE key start stop [WITHSCORES]
如果需要获得元素的分数的可以在命令尾部加上"WITHSCORES"参数
6.4 获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
6.5 增加某个元素的分数,返回值是更改后的分数。
ZINCRBY key increment member
6.6 获得集合中元素的数量
ZCARD key
6.7 获得指定分数范围内的元素个数
ZCOUNT key min max
6.8 获取元素下标
zscore key member
6.9 删除元素
zrem key member
6.10 按照排名范围删除元素
ZREMRANGEBYRANK key start stop
6.11 按照分数范围删除元素
ZREMRANGEBYSCORE key score score
6.12 获取元素的排名
从小到大
ZRANK key member
从大到小
ZREVRANK key member
相关推荐
- Java培训机构,你选对了吗?(java培训机构官网)
-
如今IT行业发展迅速,不仅是大学生,甚至有些在职的员工都想学习java开发,需求量的扩大,薪资必定增长,这也是更多人选择java开发的主要原因。不过对于没有基础的学员来说,java技术不是一两天就能...
- 产品经理MacBook软件清单-20个实用软件
-
三年前开始使用MacBookPro,从此再也不想用Windows电脑了,作为生产工具,MacBook可以说是非常胜任。作为产品经理,值得拥有一台MacBook。MacBook是工作平台,要发挥更大作...
- RAD Studio(Delphi) 本月隆重推出新的版本12.3
-
#在头条记录我的2025#自2024年9月,推出Delphi12.2版本后,本月隆重推出新的版本12.3,RADStudio12.3,包含了Delphi12.3和C++builder12.3最...
- 图解Java垃圾回收机制,写得非常好
-
什么是自动垃圾回收?自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用...
- Centos7 初始化硬盘分区、挂载(针对2T以上)添加磁盘到卷
-
1、通过命令fdisk-l查看硬盘信息:#fdisk-l,发现硬盘为/dev/sdb大小4T。2、如果此硬盘以前有过分区,则先对磁盘格式化。命令:mkfs.文件系统格式-f/dev/sdb...
- 半虚拟化如何提高服务器性能(虚拟化 半虚拟化)
-
半虚拟化是一种重新编译客户机操作系统(OS)将其安装在虚拟机(VM)上的一种虚拟化类型,并在主机操作系统(OS)运行的管理程序上运行。与传统的完全虚拟化相比,半虚拟化可以减少开销,并提高系统性能。虚...
- HashMap底层实现原理以及线程安全实现
-
HashMap底层实现原理数据结构:HashMap的底层实现原理主要依赖于数组+链表+红黑树的结构。1、数组:HashMap最底层是一个数组,称为table,它存放着键值对。2、链...
- long和double类型操作的非原子性探究
-
前言“深入java虚拟机”中提到,int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long和double类型的操作并不是原子操作,这样就会造成错误数据的出现。其实这里的某些jvm是指...
- 数据库DELETE 语句,还保存原有的磁盘空间
-
MySQL和Oracle的DELETE语句与数据存储MySQL的DELETE操作当你在MySQL中执行DELETE语句时:逻辑删除:数据从表中标记为删除,不再可见于查询结果物理...
- 线程池—ThreadPoolExecutor详解(线程池实战)
-
一、ThreadPoolExecutor简介在juc-executors框架概述的章节中,我们已经简要介绍过ThreadPoolExecutor了,通过Executors工厂,用户可以创建自己需要的执...
- navicat如何使用orcale(详细步骤)
-
前言:看过我昨天文章的同鞋都知道最近接手另一个国企项目,数据库用的是orcale。实话实说,也有快三年没用过orcale数据库了。这期间问题不断,因为orcale日渐消沉,网上资料也是真真假假,难辨虚...
- 你的程序是不是慢吞吞?GraalVM来帮你飞起来性能提升秘籍大公开
-
各位IT圈内外的朋友们,大家好!我是你们的老朋友,头条上的IT技术博主。不知道你们有没有这样的经历:打开一个软件,半天没反应;点开一个网站,图片刷不出来;或者玩个游戏,卡顿得想砸电脑?是不是特别上火?...
- 大数据正当时,理解这几个术语很重要
-
目前,大数据的流行程度远超于我们的想象,无论是在云计算、物联网还是在人工智能领域都离不开大数据的支撑。那么大数据领域里有哪些基本概念或技术术语呢?今天我们就来聊聊那些避不开的大数据技术术语,梳理并...
- 秒懂列式数据库和行式数据库(列式数据库的特点)
-
行式数据库(Row-Based)数据按行存储,常见的行式数据库有Mysql,DB2,Oracle,Sql-server等;列数据库(Column-Based)数据存储方式按列存储,常见的列数据库有Hb...
- AMD发布ROCm 6.4更新:带来了多项底层改进,但仍不支持RDNA 4
-
AMD宣布,对ROCm软件栈进行了更新,推出了新的迭代版本ROCm6.4。这一新版本里,AMD带来了多项底层改进,包括更新改进了ROCm的用户空间库和AMDKFD内核驱动程序之间的兼容性,使其更容易...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)