百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

spring&redis 的整合操作

mhr18 2024-11-28 08:53 17 浏览 0 评论

1.Spring Data 简介

Spring Data redis是Spring Data项目下的一个子模块。
查看 Spring Data的官网:http://projects.spring.io/spring-data/
Spring Data 的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。

2. 创建maven 项目

2.1 除spring的依赖外额外需要添加的依赖

<!-- 连接redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>

2.2配置spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--1 配置工厂类 -->
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<!--1.1 服务器地址 -->
<property name="hostName" value="192.168.224.130"></property>
<!--1.2 端口号-->
<property name="port" value="6379"></property>
</bean>
<!-- 3 redisTemplate -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<!--3.1注入工厂-->
<property name="connectionFactory" ref="jedisConnectionFactory"></property>
<!--key序列化-->
<property name="keySerializer" ref="stringRedisSerializer"></property>
<!--value序列化 推荐使用genericJackson2JsonRedisSerializer-->
<property name="valueSerializer" ref="genericJackson2JsonRedisSerializer"></property>
</bean>
<!--stringRedisSerializer-->
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
<!--JdkSerializationRedisSerializer-->
<bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"></bean>
<!--GenericJackson2JsonRedisSerializer-->
<bean id="genericJackson2JsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"></bean>
<!--Jackson2JsonRedisSerializer-->
<bean id="jackson2JsonRedisSerializer" class="org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer">
<constructor-arg value="java.lang.Object"></constructor-arg>
</bean>
</beans>

StringRedisSerializer

一般key的序列化使用

JdkSerializationRedisSerializer

默认的序列化方式

GenericJackson2JsonRedisSerializer(选择)

支持对象转json,json转对象的序列和反序列化,支持带泛型的对象,效率比Jackson2JsonRedisSerializer低

Jackson2JsonRedisSerializer

支持对象转json,json转对象的序列和反序列化,不支持泛型,效率高

2.3 存读储string

@Test //string
public void test1(){
ValueOperations<String,Object> valueOperations = redisTemplate.opsForValue();
valueOperations.set("name","jack");
valueOperations.set("address","北京");
valueOperations.set("age",12);
valueOperations.increment("age",2);//让年龄+2
Object name = valueOperations.get("name");
Object address = valueOperations.get("address");
Object age = valueOperations.get("age");
System.out.println("name:"+name+"address:"+address+"age:"+age);
}

2.4 存读list

2.4.1 单个添加和获取

@Test //单个添加和获取
public void testList1(){
ListOperations forList = redisTemplate.opsForList();
//从左侧单个添加
forList.leftPush("list1","a");
forList.leftPush("list1","b");
forList.leftPush("list1","c");
forList.leftPush("list1","d");
//从右侧单个添加
forList.rightPush("list1","x");
forList.rightPush("list1","y");
forList.rightPush("list1","z");
//获取
List list1 = forList.range("list1", 0, -1);
for (Object o : list1) {
System.out.println(o);
}
}

2.4.2 批量添加和获取

@Test //批量添加和获取
public void testList2() {
ListOperations forList = redisTemplate.opsForList();
//========== 方式1
forList.rightPushAll("list2", "a", "b", "c");//批量添加-方式1
//获取
List list2 = forList.range("list2", 0, -1);
for (Object o : list2) {
System.out.println(o);
}
//========== 方式2
ArrayList<String> list = new ArrayList<>();
list.add("x");
list.add("y");
list.add("z");
forList.rightPushAll("list3", list);//批量添加-方式2
List list3 = forList.range("list3", 0, -1);
for (Object o : list3) {
System.out.println(o);
}
}

2.4.3 存储对象

@Test //批量添加和获取对象
public void testList3() {
ListOperations<String,User> forList = redisTemplate.opsForList();
forList.rightPush("userList",new User(1,"张三",12));
forList.rightPush("userList",new User(2,"李四",13));
List<User> userList = forList.range("userList", 0, -1);
for (User user : userList) {
System.out.println(user);
}
}

2.5 存储set

2.5.1基本的存取

@Test
public void testSet() {
SetOperations set = redisTemplate.opsForSet();
set.add("set1","java","c++","php","c");//存
set.add("set1","java","c","jsp");
set.remove("set1","jsp");//删除指定key
Set set1 = set.members("set1");//取
System.out.println(set1);
}

2.5.2 求交并差集

@Test
public void testSet1() {
SetOperations set = redisTemplate.opsForSet();
set.add("set2","a","b","c");
set.add("set3","x","y","c");
//交集
Set set1 = set.intersect("set2", "set3");
System.out.println("交集:"+set1);
//并集
Set set2 = set.union("set2", "set3");
System.out.println("并集:"+set2);
//差集
Set set3 = set.difference("set2", "set3");
System.out.println("差集:"+set3);
}

2.6 存储zset(sorted_set)

@Test
public void testsorted_set(){
ZSetOperations zSet = redisTemplate.opsForZSet();
zSet.add("zset1","张三",89);
zSet.add("zset1","李四",79);
zSet.add("zset1","王五",99);
zSet.add("zset1","赵六",100);//存
Set zset1 = zSet.range("zset1", 0, -1);//默认按升序显示并不显示分值
// System.out.println(zset1);
Set zset11 = zSet.rangeByScore("zset1", 80, 100);//按分值区间查询不显示分值
// System.out.println(zset11);
Set<ZSetOperations.TypedTuple<Object>> zset12 = zSet.rangeByScoreWithScores("zset1", 80, 100);//按分值区间查询显示分值
for (ZSetOperations.TypedTuple<Object> objectTypedTuple : zset12) {
// System.out.println("name:"+objectTypedTuple.getValue()+"value:"+objectTypedTuple.getScore());
}
//按分值区间查询显示分值--倒序
Set<ZSetOperations.TypedTuple<Object>>zset13 = zSet.reverseRangeByScoreWithScores("zset1", 0, 100);
for (ZSetOperations.TypedTuple<Object> objectTypedTuple : zset13) {
System.out.println("name:"+objectTypedTuple.getValue()+"value:"+objectTypedTuple.getScore());
}
}

2.7 存储hash

2.7.1 命令

2.7.2 使用场景

2.7.2.1 -存对象

Redis哈希对象常常用来缓存一些对象信息,如用户信息、商品信息、配置信息等。

我们以用户信息为例,它在关系型数据库中的结构是这样的

uid

name

age

1

Tom

15

2

Jerry

13

使用redis存储后的结构是:

  1. 序列化字符串后,将用户信息序列化后用一个键保存
@Test
public void testHash(){
HashOperations hash = redisTemplate.opsForHash();
//方式一存储
hash.put("user:1","name","tom");
hash.put("user:1","age","15");
hash.put("user:2","name","jerry");
hash.put("user:2","age","13");
//获取-获取用户1的名字
Object name = hash.get("user:1", "name");
System.out.println(name);
hash.put("users","1",new User(1,"tom",15));
hash.put("users","2",new User(2,"jerry",13));
//获取用户1 的全部信息
Object users = hash.get("users", "1");
System.out.println(users);
}

2.7.2.1 -购物车

购物车的定义非常简单:我们以每个用户的用户ID(或者CookieId)作为Redis的Key,每个用户的购物车都是一个哈希表,这个哈希表存储了商品ID与商品订购数量之间的映射。在商品的订购数量出现变化时,我们操作Redis哈希对购物车进行更新:

如果用户订购某件商品的数量大于0,那么程序会将这件商品的ID以及用户订购该商品的数量添加到散列里面。


@Test//购物车
public void testHash2() {
HashOperations hash = redisTemplate.opsForHash();
//user-1:代表用户1,gid-1:代表商品id =1,购买数量:2
hash.put("user-1","gid-1",2);
hash.put("user-1","gid-2",1);
//让购买的商品加减
hash.increment("user-1","gid-1",-1);//商品1 -1
hash.increment("user-1","gid-2",1);//商品2 +1
//查询购物车
Map map = hash.entries("user-1");
Set set = map.entrySet();
for (Object o : set) {
System.out.println(o);
}
}

2.7.2.3 -用作计数器

Redis 哈希表作为计数器的使用也非常广泛。它常常被用在记录网站每一天、一月、一年的访问数量。每一次访问,我们在对应的field上自增1

@Test//博客访问量
public void testHash3() {
HashOperations hash = redisTemplate.opsForHash();
SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
String date = yyyyMMdd.format(new Date());
//判断key 是否存在
Boolean b = hash.hasKey("myblog", date);
if(b){//如果存在则访问量加1
hash.increment("myblog",date,1);
}else{
hash.put("myblog",date,1);//第一次访问默认访问量1
}
}

也经常被用在记录商品的好评数量,差评数量上

@Test//好评数量--伪代码
public void testHash4() {
HashOperations hash = redisTemplate.opsForHash();
hash.put("goods", "good", 0);
hash.put("goods", "bad", 0);
int flag=1;
if(flag==1) {
hash.increment("goods", "good", 1);//好评
}else {
hash.increment("goods", "bad", 1);//差评
}
}

也可以实时记录当天的在线的人数。

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: