七天玩转Redis | 打卡第5天 Java操作Redis
在实际使用中,往往不会在命令窗口中执行命令的这种方法,通常是借助工具类对Redis进行操作。Java中可以使用的用来进行Redis操作的有三种:Jedis、RedisTemplate、StringRedisTemplate。
Jedis
使用时需要导入jar包。
<!-- 使用时导入jar包 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
public static void main(String[] args) throws InterruptedException {
// 新建Jedis类对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 测试Redis连接
System.out.println("redis连接测试:" + jedis.ping());
System.out.println("判断某个键是否存在:" + jedis.exists("mykey"));
// 获取所有键,并输出
Set<String> keys = jedis.keys("*");
System.out.println(keys);
System.out.println("删除键" + jedis.del("mykey"));
/**
* String类型
*/
// 设置一个键值对
jedis.set("mykey1", "myValue1");
jedis.set("mykey2", "myValue2");
jedis.set("mykey3", "myValue3");
// 根据索引获取一个数据的值
System.out.println("得到的数值为:" + jedis.get("mykey2"));
System.out.println("获取多个键值对:" + jedis.mget("mykey1", "mykey2", "mykey3"));
System.out.println("获取mykey1的数据的长度:" + jedis.strlen("mykey1"));
System.out.println("返回key中字符串值的子串:" + jedis.getrange("mykey2", 1, 5));
System.out.println("字符串追加:" + jedis.append("mykey3", "hello"));
System.out.println("获取到mykey3的值:" + jedis.get("mykey3"));
/**
* Hash类型
*/
// 设置一个Hash数据
Map<String, String> valueMap = new HashMap<>();
valueMap.put("name", "huixiaoyuan");
valueMap.put("sex", "男");
valueMap.put("age", "3");
System.out.println("设置一个Hash数据" + jedis.hmset("myHash", valueMap));
System.out.println("获取指定哈希表中所有的字段和值:" + jedis.hgetAll("myHash"));
System.out.println("获取存储在哈希表中指定字段的值:" + jedis.hget("myHash", "name"));
System.out.println("删除一个或多个哈希表字段:" + jedis.hdel("myHash", "sex"));
System.out.println("获取哈希表中字段的数量:" + jedis.hlen("myHash"));
/**
* List类型
*/
System.out.println("将一个或多个元素插入列表表头:" + jedis.lpush("myList", "l1", "l2", "l3"));
System.out.println("将一个或多个元素插入列表尾部:" + jedis.rpush("myList", "l4"));
System.out.println("获取列表长度:" + jedis.llen("myList"));
System.out.println("通过索引获取列表中的元素:" + jedis.lindex("myList", 2));
System.out.println("移除并获取列表第一个元素:" + jedis.lpop("myList"));
System.out.println("移除并获取列表最后一个元素:" + jedis.rpop("myList"));
/**
* Hash类型
*/
System.out.println("设置一个Hash数据" + jedis.hmset("myHash", valueMap));
System.out.println("获取指定哈希表中所有的字段和值:" + jedis.hgetAll("myHash"));
System.out.println("获取存储在哈希表中指定字段的值:" + jedis.hget("myHash", "name"));
System.out.println("删除一个或多个哈希表字段:" + jedis.hdel("myHash", "sex"));
System.out.println("获取哈希表中字段的数量:" + jedis.hlen("myHash"));
/**
* Set类型
*/
System.out.println("向集合中添加一个或多个成员:" + jedis.sadd("mySet","s1","s2","s3"));
System.out.println("向集合中添加一个或多个成员:" + jedis.sadd("mySet2","s3","s4","s5"));
System.out.println("获取集合中成员的个数:" + jedis.scard("mySet"));
System.out.println("返回第一个集合与其他集合之间的差异:" + jedis.sdiff("mySet","mySet2"));
System.out.println("返回集合中的所有元素:" + jedis.smembers("mySet"));
/**
*ZSet类型
*/
System.out.println("向有序集合中添加一个或多个成员:" + jedis.zadd("myZset",1,"m1"));
System.out.println("向有序集合中添加一个或多个成员:" + jedis.zadd("myZset",2,"m2"));
System.out.println("向有序集合中添加一个或多个成员:" + jedis.zadd("myZset",3,"m3"));
System.out.println("获取有序集合的成员数:" + jedis.zcard("myZset"));
System.out.println("计算有序集合中指定区间分数的成员数:" + jedis.zcount("myZset",0,2));
System.out.println("移除有序集合中的一个或多个元素:" + jedis.zrem("myZset","m2"));
}
RedisTemplate
RedisTempate类也是在Java中操作Redis的常用类,与Jedis区别如下:
- Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。
- SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring系列框架进行搭配使用。
所以Jedis一般可以用于没有使用spring系列框架的场景,而RedisTempate则多用于企业利用框架的实际开发中。
RedisTemplate的使用
redisTemplate.opsForValue(); 对应String类型操作
redisTemplate.opsForHash(); 对应Hash类型操作
redisTemplate.opsForList(); 对应List类型操作
redisTemplate.opsForSet(); 对应Set类型操作
redisTemplate.opsForZSet(); 对应ZSet类型操作
StringRedisTemplate
与RedisTemplate的区别:
- StringRedisTemplate继承自RedisTemplate。
- 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
- SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
- StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
- RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
最佳实践
当你的redis数据库里面本来存的就是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
在操作上,StringRedisTemplate和RedisTemplate是一样的。
总结
- Jedis适合在没有spring系列框架的普通Java工程中使用
- RedisTemplate适合在多种数据类型的项目,且希望自动进行数据转换的情况下使用
- StringRedisTemplate适合在只有字符串处理的情况下使用
在实际使用中,可根据项目实际情况,选择更适合的工具进行开发。
相关推荐
Java+SSM+MySQL+微信小程序构建英语学习激励系统:从毕业设计到工程实践
在Java Web开发领域,SSM(Spring+SpringMVC+MyBatis)框架组合因其清晰的MVC分层架构和对核心编程思想(如IoC、AOP、ORM)的完整实践,依然是理解企业级应用开发的经典选择。其原理在于通过Spring的IoC容器管理对象生命周期,利用AOP处理横切关注点如事务管理,MyBatis则提供了灵活的SQL映射能力,实现对数据库的精准操作。这种技术栈的价值在于能够构建结构清晰、易于维护的中小型项目,尤其适合需要复杂业务逻辑和数据统计的场景,例如在线教育、用户激励系统等应用。本文聚
【信息科学与工程学】【广告科学】第四十四篇 广告平台投放和广告计费类算法01
全行业的中国企业广告投放模型总表。行业分类依据《国民经济行业分类》(GB/T 4754—2017)的门类/大类 ,产品层参考"主营产品统计代码"行业—产品映射 ,平台算法以巨量引擎、腾讯广告等官方文档为硬支撑 ,合规部分严格对齐《互联网广告管理办法》以及2026年市场监管部门最新合规提示 。编号类型(门类)行业(大类)企业及产品内容列表投放模型投放平台投放人群欲望激发维度面向人群模式(地域/文化/年龄/角色)001A 农林牧渔01 农业北大荒/中粮:五常大米、面粉、食用油、杂粮品牌曝光 + 电商转化双轨(C
基于MATLAB的复合弹性模量分析,采用混合法则,结合纤维体积分数变化和图形结果。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
基于MATLAB的自适应纯追踪曲线跟踪机器人仿真,采用多路径、自适应速度控制和图形界面可视化。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
【数据库优化】通信行业B/O域查询性能提升:基于分区裁剪与覆盖索引的秒级溯源系统实现
内容概要:本文围绕通信行业中海量话单与信令数据的查询性能问题,系统阐述了从全表扫描到秒级响应的数据库优化路径。文章以运营商 cdr_detail 表为案例,揭示了因使用函数操作索引列(如DATE(call_start_time))和深分页(LIMIT offset, size)导致的全表扫描问题,并提出完整的优化方案:通过时间范围RANGE分区实现分区裁剪、构建msisdn与时间的联合覆盖索引、消除索引列函数运算、采用游标分页替代OFFSET等方式,使查询性能从P95 8.3秒降至290毫秒。同时介绍了执行计划分析(EXPLAIN)在调优中的关键作用,并展望了HTAP架构、向量化执行与AI自治优化器等未来方向。; 适合人群:具备一定数据库基础知识,从事通信行业数据开发、DBA或后端研发的技术人员,尤其是面对大规模时序数据查询性能瓶颈的工程师;; 使用场景及目标:①解决营业厅用户详单查询、网间结算对账、VoNR信令分析等高并发、低延迟查询场景下的性能问题;②掌握如何通过分区策略、索引设计和SQL改写实现从全表扫描到精准索引访问的优化落地; 阅读建议:建议结合实际生产环境中的大表查询案例,对照本文的反例与正例进行执行计划对比分析,并在测试环境中实践分区表创建、覆盖索引构建及游标分页改写,深入理解每项优化技巧的实际效果。


