Redis--Lesson05--Redis进阶

news/2025/3/11 23:46:20/文章来源:https://www.cnblogs.com/5ran2yl/p/18766051

一.Redis中的事务

在Redis中,单条命令依旧保持原子性,但是对于事务来说(命令集)不保证原子性

Redis事务的本质:一组命令的集合,一个事务中所有的命令都会被序列化,在事务的执行过程中,会按照顺序执行,一次性,顺序性,排他性!执行一些命令

如:--- 队列  set1,set2,set3  执行--

Redis事务没有隔离级别的概念,在创建Redis事务中,命令不会被直接执行,而是由exec命令发出后开始队列化执行

Redis执行事务的过程:

  • 开启事务(multi)
  • 命令入队(......)
  • 执行事务(exec)

 放弃事务:DISCARD

 执行事务的两种错误情况

1.编译型异常(代码有问题,命令有错)

这种错误会导致整个事务都不会被执行

 2.运行时异常(代码逻辑异常)

如果事务队列存在语法性的错误,那么执行命令的时候,其它命令都是可以正常执行的,但是语法性错误的指令肯定执行不了,丢失原子性

 二.Redis中的乐观锁(监控)

悲观锁(Pessimistic Locking)

  • 假设最坏的情况会发生,在读取数据时就加锁,防止其他事务修改该数据。
  • 在整个事务过程中保持锁定状态,直到事务提交或回滚。

乐观锁(Optimistic Locking)

  • 假设在大多数情况下不会发生冲突,因此在读取数据时不加锁。
  • 在更新数据时才检查数据是否被其他事务修改过。如果没有被修改,则更新成功;如果已经被修改,则放弃本次更新或重新尝试。

watch:监视对象

当在被监视的情况下的对象发生变化,那么事务会执行失败,需要放弃原监视后,再次监视;如果事务执行成功,则自动放弃监视

 执行失败的情况:

在监视的情况下,另外的一个线程率先更改值,那么被监视的事务会执行失败

另一线程率先更改

 返回本线程执行事务:

 本线程执行失败

 三.Jedis

使用Java操作redis是官方推荐使用的一款API,Jedis是一款操作Redis的中间件,也是操作redis的基础,虽然在springBoot中已经被其它的中间件取代,但是Jedis的操作上手程度很适合新手

导入依赖:

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version>
</dependency>

 

直接新建一个Jedis测试类,创建一个jedis对象,并且传递参数

//创建jedis对象Jedis jedis = new Jedis("127.0.0.1",6379);//测试连接System.out.println(jedis.ping());

 

String类型测试

//测试String类型jedis.set("name","maming");System.out.println(jedis.get("name"));//批量创建k-vjedis.mset("k1","v1","k2","v2","k3","v3");//批量获得值System.out.println(jedis.mget("k1", "k2", "k3"));

 测试list集合

//清空数据库
        jedis.flushDB();//向list中添加元素jedis.lpush("list","a","b","c");//获取list中的所有元素System.out.println(jedis.lrange("list",0,-1));//从list中弹出最后一个元素System.out.println(jedis.rpop("list"));//获取list中的所有元素System.out.println(jedis.lrange("list",0,-1));

 测试set集合

//清空数据库
        jedis.flushDB();//向集合中添加元素jedis.sadd("myset","a","b","c");//打印集合中的元素System.out.println(jedis.smembers("myset"));

 其它的命令都是和在redis上一样的,都不用测试了

Jedis事务

在Jedis中的事务和Redis中过程都是一样的,并且性质也是一样,只不过使用Java语言开启和执行事务罢了

//清空数据库
        jedis.flushDB();// 创建一个JSONObject对象JSONObject jsonObject = new JSONObject();// 向JSONObject对象中添加键值对jsonObject.put("name","zhangsan");jsonObject.put("age","18");// 将JSONObject对象转换为字符串String re = jsonObject.toString();// 创建一个Transaction对象Transaction multi = jedis.multi();try {// 在Transaction对象中执行set操作multi.set("user1",re);multi.set("user2",re);// 执行Transaction对象中的操作
            multi.exec();}catch (Exception e){// 打印异常信息
            e.printStackTrace();// 放弃Transaction对象中的操作
            multi.discard();}finally {// 打印user1的值System.out.println(jedis.get("user1"));// 打印user2的值System.out.println(jedis.get("user2"));// 关闭jedis连接
            jedis.close();}

 

 四.SpringBoot整合Redis

如果SpringBoot需要操作数据类型必须要使用另一个家族成员SpringData

在SpringBoot2.0以后的版本Jedis都被改为lettuce

Jedis:采用的是直连,多个线程操作是不安全的,想要避免的话就是用jedis线程池

lettuce:次啊用netty,实例可以在多个线程中共享,不存在线程不安全的情况

安装依赖:

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

 

配置Redi数据源:

spring.data.redis.host=127.0.0.1
spring.data.redis.port=6379
spring.data.redis.database=0

 

测试类:

 @Autowiredprivate RedisTemplate redisTemplate;@Test// 测试上下文加载void contextLoads() {// 从Redis中获取键为"name"的值并打印System.out.println(redisTemplate.opsForValue().get("name"));// 将字符串"a"添加到Redis中键为"list"的列表的左边redisTemplate.opsForList().leftPush("list","a");// 从Redis中键为"list"的列表的左边弹出元素并打印System.out.println(redisTemplate.opsForList().leftPop("list"));}

 

测试结果

springBoot整合后的主要操作数据方法:

 

opsForValue): 用于处理简单的字符串键值对。
opsForList): 用于处理列表数据结构。
opsForSet): 用于处理无序集合数据结构。
opsForZSet): 用于处理有序集合数据结构。
opsForHash): 用于处理哈希数据结构。

 

Redis自动配置类:

 Redis的自动配置属性(默认写入的地址和端口):

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897480.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于入侵野草算法的KNN分类优化matlab仿真

1.程序功能描述 基于入侵野草算法的KNN分类优化。其中,入侵野草算法是一种启发式优化算法,它模拟了自然界中野草的扩散与竞争过程。该算法通过一系列的步骤来寻找样板的最优特征,参与KNN的分类训练和测试。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完…

PowerShell实现全屏七彩渐变 呼吸 屏保

引言 想做一下屏幕保护程序的效果-----全屏颜色渐变,类似呼吸灯的效果。就用Windows自带的PowerShell脚本。脚本预设好了七彩颜色,然后循环变化。首先 我们先实现七彩循环切换的全屏效果,也就是不带渐变。 要想实现全屏颜色填充,必须借助"窗口"。对于PowerShell而…

三剑客与正则系列-awk勇闯天下

1.awk概述四剑客 特点 擅长find 查找文件 查找文件,与其他命令配合.grep/egrep 过滤 过滤速度最快.sed 过滤,取行,替换,删除 替换,修改文件内容,取行.awk 过滤,取行,取列,统计计算,判断,循环 ... 取列,取行,统计计算awk是一个语言,叫做单行脚本.2.概述 2.1.格式 取出/etc/passw…

实验楼-Linux(ubuntu)

实验楼-Linux(ubuntu) 1. Linux的桌面系统2. 命令 --help显示更为简单的内容软/硬连接:ln硬连接ln 目的地 硬连接名称硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一…

Day10_强制类型转换

VHDL强制类型转换1、STD_LOGIC_VECTOR 转 INTEGER 先将STD_LOGIC_VECTOR根据需求使用signed()转为 SIGNED 或者 使用 unsigned() 转为 UNSIGNED (signed() 和 unsigned() 在 numeric_std 中),然后使用 conv_integer() 或者 to_integer() 转为整数。 conv_integer() 和 to_in…

安装新系统的基础环境

安装新系统的基础环境 ubuntu从阿里云镜像上下载服务器版本系统,安装的时候出现curtin command in-target,需要把apt网址改为http://mirrors.163.com/ubuntu/下载man命令:apt install man看onenote笔记在~/.zshrc中最后一行加上这两行LANG=zh_CN.UTF-8 LANGUAGE=zh_CN.UTF-8cen…

Android Studio初使用

下载是困难,下载速度慢,了解了外网的知识,头一次知道。

第五章 用户身份与文件权限

第五章 用户身份与文件权限 用户身份与能力身份分类管理员UID为0:系统的管理员用户。 系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。 普通用户UID从1000开始:…

瑞典农业育种公司OlsAro融资开发人工智能作物育种平台

瑞典农业育种初创公司OlsAro(官网:https://olsaro.com/)致力于利用人工智能和尖端植物生物技术,开发能够抵御盐分、高温和干旱等环境压力的农作物品种。今年4月OlsAro获得250万欧元种子轮融资,其首款产品为耐盐小麦,在孟加拉国的盐碱条件下,与中度耐盐品种相比,新品种的…

常用命令三

1.0 git相关 1.1 git config // 配置全局用户名 git config --global user.name "Your Name" // 配置全局邮箱 git config --global user.email "mail@example.com" // 配置Git使用store方式来处理凭证(如用户名和密码)。 // 具体来说,它会将你的Git凭证…

3.11学习苍穹外卖学习笔记

今天前半部分完成了关于redis的基础的知识学习 成功在java代码中操作redis数据库 可以完成CRUD 完成了项目中店铺打烊营业的功能还未深入学习 后半部分学习了微信小程序开发和微信登陆的功能目前正在学习 了解到微信有完整的登录校验和流程

数据资产专题报告300+份集萃解读|附PDF下载

原文链接:https://tecdat.cn/?p=40764 在当今数字经济蓬勃发展的时代,数据资产已成为推动企业创新与经济增长的关键力量。本报告汇总解读聚焦于数据资产领域,深入剖析其在多方面的发展态势。从数据资源入表的实践情况出发,探究企业在数据资产核算方面的现状;进而分析数据…