Redis的使用实例(一)

Redis五大数据类型与使用场景汇总!!(含完整实战案例,建议收藏) 无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! 阅读详情

一、缓存实例

1.读数据

	public ProductSellDetailsModel getProductSellInfo(Long productId) {
        ProductSellDetailsModel productSellDetailsModel;
        // 查询缓存
        Object productSell =
                stringRedisTemplate.opsForHash().get("redis:productSellDetail", productId + "");
        if (StringUtils.isEmpty(productSell)) {
            // 缓存未找到 查db
            productSellDetailsModel = productSellDaoMapper.queryByProductId(productId);
            if(!StringUtils.isEmpty(productSellDetailsModel)){
                stringRedisTemplate.opsForHash().put("redis:productSellDetail",
                        productId + "", JSON.toJSONString(productSellDetailsModel));
            }
        } else {
            productSellDetailsModel = 
            	JSONObject.parseObject(String.valueOf(productSell),ProductSellDetailsModel.class);
        }
        return productSellDetailsModel;
    }

二、分布式锁

在部署了多台Tomcat服务的情况下,为了解决并发场景下的超卖问题,synchronized本地锁已经无法解决问题。在此情况下我们可以考虑Redis分布式锁。

方案一:

Boolean lock =stringRedisTemplate.opsForValue().setIfAbsent("redisLock"+productId,"lock");
if(lock){
	// 拿到锁后  执行逻辑
}else{
	// 未拿到锁
}
// 释放锁
stringRedisTemplate.delete("redisLock"+productId);

方案一,大致逻辑没有问题,但是方案还有很多缺点。
比如:在执行业务逻辑抛异常后、或者在释放锁操作时宕机,导致释放锁操作失败,从而产生死锁问题。
针对这两个问题做优化:
1.业务逻辑抛异常。可以使用try finally
2.在释放锁操作前宕机。可以给锁添加一个失效时间

方案二:

try{
    // 先设置锁,再设置超时时间,两条命令,没有保证命令的原子性
	//Boolean lock =stringRedisTemplate.opsForValue().setIfAbsent("redisLock"+productId,"lock");
	//stringRedisTemplate.expire("redisLock"+productId,10,TimeUnit.SECONDS);
	Boolean lock = stringRedisTemplate.opsForValue()
					.setIfAbsent("redisLock"+productId, "lock",10, TimeUnit.SECONDS);
	if(lock){
		// 拿到锁后  执行逻辑
	}else{
		// 未拿到锁
	}
}finally{
	// 释放锁
	stringRedisTemplate.delete("redisLock"+productId);
}

方案二相对于方案一而言,代码更加健壮一些,但还是存在一些问题。
例如:有三个线程同时执行这段代码
1.线程一先拿到锁,开始执行业务逻辑,假设业务逻辑执行时间需要12秒,超过了设置的锁过期时间10秒,导致锁失效,而此时线程一还在执行业务逻辑
2.线程二和三一直在等待锁释放,当锁失效后,线程二拿到了锁后,执行了2秒,而线程一已经执行12秒,逻辑已经执行完成,释放锁,但是此时线程二还在执行业务逻辑。
3.线程二加的锁被线程一释放掉,而线程二还在执行业务逻辑,线程三拿到锁后,也开始执行业务逻辑…
4.如此逻辑下去,不难发现分布式锁的效果并没有实现。

针对上面情景进行问题分析:
a.锁的失效时间不应该小于业务逻辑的执行时间。业务逻辑的执行时间受多重因素影响,是不确定的,因此锁的失效时间设置多少都是不合理的。那我们可不可以新开启一个线程,定时去获取锁的状态,如果有线程在使用,则更新一下过期时间,以此来延迟锁失效。
b.上面的场景可以看到,线程二加的锁被线程一给释放了。我们则可以进行限制,自己加的锁只能自己进行释放。

方案三:

// 生成唯一id
String uuid = UUID.randomUUID().toString();
try{
    // 先设置锁,再设置超时时间,两条命令,没有保证命令的原子性
	//Boolean lock =stringRedisTemplate.opsForValue().setIfAbsent("redisLock"+productId,"lock");
	//stringRedisTemplate.expire("redisLock"+productId,10,TimeUnit.SECONDS);
	Boolean lock = stringRedisTemplate.opsForValue()
					.setIfAbsent("redisLock"+productId, uuid,10, TimeUnit.SECONDS);
	if(lock){
		// 拿到锁后  执行逻辑
	}else{
		// 未拿到锁
	}
}finally{
			 // 释放锁
			 // 查询和删除没有原子性操作,故舍弃,采用Lua脚本的方式,保证操作的原子性
//            String redisLock = stringRedisTemplate.opsForValue().get("redisLock");
//            if(uuid.equals(redisLock)){
//                // 清理锁
//                log.info("清理锁==>"+redisLock);
//                stringRedisTemplate.delete("redisLock");
//            }
            // 脚本解锁
            String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
            stringRedisTemplate.execute(
            	new DefaultRedisScript(script, Long.class),  Arrays.asList("redisLock"+productId), uuid);
}

上面的代码并没有加入锁续命的逻辑,当然代码还是有些地方需要优化。从上面的整个思维来看,除了业务逻辑外,还需要添加很多分布式锁相关代码,整个逻辑相对更加复杂。而redisson框架,帮我们解决了这些问题。

redisson的使用可浏览下个章节

docker搭建redis一主一从一哨兵 一、利用docker-machine搭建测试环境 docker-machine 创建两个虚拟机 docker-machine create -d virtualbox master docker-machine create -d virtualbox slave 登录虚拟主机 docker-machine ssh master docker-machine ssh slave 获得ip地址:... 阅读详情

相关推荐

Redis使用实例

代码都是我自己测试过的,已经放在我的项目中了,解压之后可以使用。

海量数据和高并发下的 Redis 业务优化实践

观众朋友们,我是来自掌阅的工程师钱文品,掘金小册《Redis 深度历险》的作者。今天我带来的是分享主题是:Redis 在海量数据和高并发下的优化实践。Redis 对于从事互联网技术工程师来说并不陌生,几乎所有的大中型企业都在使用 Redis 作为缓存数据库,但是对于绝大多数企业来说只会用到它的最基础的 KV 缓存功能,还有很多 Redis 的高级功能可能都未曾认真实践过。今天在这一个小时的时间我会...

微信公众号:一颗向上的草莓 745

Robocup3d

一、 比赛介绍 RoboCup 仿真比赛是一个能为多智能体系统和模拟智能进行研究、教育的工具。比赛是在一个标准的计算机环境中进行的,提供了一个完全分布式控制、实时异步多智能体环境。通过这个平台,可以测试各种理论、算法和Agent体系结构。在实时异步、有噪声的对抗环境中,研究多智能体的合作对抗问题。当然,仿真组的比赛使用的机器人并非是真的机器人。一个机器人是一个Agent, 它拥有自己的大脑,

zhanghe2775115的专栏 7265

Redis详解(五)——Redis多实例

今天继续给大家介绍Redis的相关知识,本文主要内容是Redis的多实例配置。 一、Redis多实例简介 二、Redis多实例配置实现 (一)Redis多实例配置文件 (二)Redis多实例开启与效果验证 (三)Redis多实例关闭

永远是少年 5720

Windows系统下com0com虚拟串口安装与驱动签名禁用全攻略

本文详细介绍了在Windows系统下安装com0com虚拟串口工具的全过程,包括驱动签名问题的解决方法。通过禁用驱动程序强制签名,用户可以顺利安装并使用这款开源工具创建虚拟串口对,适用于软件开发测试、硬件调试等场景。文章还提供了验证虚拟串口功能的实用技巧和常见问题解决方案。

weixin_28720573的博客 386

从零到一:手把手教你用SAM-BA工具完成嵌入式系统烧录

本文详细介绍了如何使用SAM-BA工具完成嵌入式系统烧录的全过程,包括环境搭建、硬件连接、Bootloader烧录以及完整系统镜像的烧录步骤。针对常见问题提供了实用的排查指南,并分享了批量烧录和自定义脚本的高级技巧,帮助开发者高效完成嵌入式系统开发。

weixin_42523792的博客 380

Redis基本使用案例

说出以上使用案例,说明你使用过redis,面试官会认为你真正的使用过redis

啊勇的博客 1990

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

Redis使用Lua脚本实例(一)

实例1 1.用vim编辑器创建01.lua脚本文件 vim 01.lua 2.编写脚本内容调用redis redis.call("set","age","30") local age = redis.call("get","age") return age 3.调用redis客户端并使用eval命令使用Lua脚本,打印age输出到控制台 [root@loca...

oGuiGui12345的博客 698

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

【北大核心-代码复现】基于 VMD-FFCM-iTransformer 光伏功率短期预测

766

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 216

【每日一问】如果你的生产环境Redis实例CPU使用很高,比如达到90%以上,请问可能产生的原因有哪些? 如何解决?

摘要:Redis服务器CPU使用率过高可能由多种原因导致,包括使用高风险命令(如KEYS、HGETALL)、热Key/大Key问题、频繁短连接、AOF频繁写磁盘、Lua脚本执行和慢查询等。解决方案包括建立监控平台、禁用高风险命令、使用连接池优化连接、拆分大Key、调整写盘频率以及使用SSD硬盘。这些措施可有效降低CPU负载,提升Redis性能。

weixin_51238676的博客 546

Windows 11 安装 MySQL 8.4:安装包方式、下载、安装、使用

本文详细介绍了在 Windows 11 系统下通过 MSI 安装包方式安装 MySQL 8.4 LTS 社区版的完整流程,包括版本选择、下载、自定义安装路径、服务配置、日志设置、示例数据库创建及后续使用方法。同时提供了命令行客户端与图形化工具 DBeaver 的连接与操作演示,适合初学者和开发者快速搭建本地 MySQL 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2258

2024三掌柜赠书活动第三十五期:Redis 应用实例

本书将从内部组件、外部应用和数据结构3个方面为读者介绍Redis常见、经典的用法与实例,并且所有实例均附有完整的Python代码,方便读者学习和参考。全书分3个部分:第一部分讲内部组件,介绍的实例通常用于系统内部,如缓存、锁、计数器、迭代器、速率限制器等,这些都是很多系统中不可或缺的部分;第二部分讲外部应用,介绍的实例都是一些日常常见的、用户可以直接接触到的应用,如直播弹幕、社交关系、排行榜、分页、地理位置等;

全沾软贱开发攻城狮 1万+

OpenCV计算机视觉实战(3)——计算机图像处理基础

本文全面介绍了计算机视觉和数字图像处理的基础知识。从最基本的像素概念入手,详细讲解了图像在计算机中的表示方式,包括RGB、CMYK等色彩空间的工作原理及其应用场景。还系统分析了常见图像和视频文件格式的特点,梳理了计算机图像处理技术的发展历程,并重点介绍了OpenCV这一强大的开源计算机视觉库的功能与应用领域。

qq_30167691的博客 1740

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

redis desktop manager 连接集群_redis主从哨兵模式搭建实例

最近因项目需要搭建redis环境,有多种模式可以选择,其中比较经典的一种模式是主从哨兵模式,下面进行这一模式的搭建演示一台虚拟机搭建一个redis主从哨兵模式简单集群: 一主、一从、一哨兵虚拟机版本 Red Hat 4.1.2-48 内存1 Gredis 版本 redis-2.8.19.tar.gz(仅举例用,版本不规定)1、上传redis安装包及规划目录root用户登录虚拟机,进入桌面建立一个文...

weixin_39754142的博客 6397

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Redis】Redis安装 配置 C#实例

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Ha...

GreAmbWang的博客 841

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

如何在linux 使用脚本 多开redis 端口实例

在实际用于中,需要多开几个redis 服务端 默认情况下 如下 $ cd src $ ./redis-server 注意这种方式启动redis 使用的是默认配置。 也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动, $ cd src $ ./redis-server ../redis.conf 也可以写一个shell脚本命令 一键启动 如下 保存为start.sh #!/bin/bash #2020年9月14日17:27:26 echo "start ...

托塔天王的博客 391

Redis一主二从Sentinel监控配置

redis

qq_37862114的博客 601

Redis集群的两种启动方式

Redis集群可以通过两种主要方式启动:手动启动和使用redis-trib工具(或redis-cli工具集)启动。

weixin_44643456的博客 978

redis类型 tp5_tp5实现Redis的简单使用

方法1:Controllernamespace app\index\controller;use think\Controller;use think\session\driver\Redis;class Index extends Controller{public function index(){$redis = new Redis();if(!$redis->has('str')){...

weixin_39876145的博客 228

Redis:启动多个redis实例

一个redis实例默认有16个数据库,但一般来说不同的项目用不同的redis实例会比较好,以免有的操作影响到其它的项目。 拷贝一份新的配置文件 cp redis.conf redis6379.conf vim修改对应的配置项 vim redis6378.conf #主要修改下面3个配置项就可以了 pidfile : /var/run/redis_6378.pid port 6378 rdbfile : dump6378.rdb 然后我们就可以redis-server指定新的配置文件,这样就可以启动.

IChen.的博客 954

nginx+redis主从+tomcat一机多实例实现会话共享

1、安装nginx2、用两个虚拟机安装两个reids(reids1、redis2) 其中一个配置slaveof 192.168.1.86 6379(另一个redis的IP与端口)3、安装两个tomcat修改tomcat的context.xml: <Context> <!-- Default set of monitored...

weixin_34194702的博客 148

IDEA中使用redis

代码】IDEA中使用redis。

drhrht的博客 572

Redis学习

1. Redis简介 1.1 NoSQL的定义 学习Redis之前,我们先来了解一下NoSQL,相信大家基本上都有接触过MySQL,它是一种典型的关系型数据库,在我们实际应用过程中也是很频繁的。既然存在像MySQL这种类型的关系数据库,那么也就存在非关系数据库,没错,NoSQL就是非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的一个良好的补充。在实际应用开发过程中,...

会呼吸的梦 155

Java 使用 Redis存储系统

redis是一个key-value存储系统。它支持存储的value类型很多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。为了保证效率,数据都是缓存在内存中。 在二维码登录功能里面,我后来把uui...

weixin_30920091的博客 135
上一篇: Redis入门实例及使用
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值