redis(6)

news2024/11/15 14:01:58

基于redis中的list类型实现分页思路:

 list数据类型的应用场景:

1)对数据量大的集合做删减,比如说百度首页的热点新闻的列表,有一个换一换的功能,我们正是利用了list集合中的分页功能,使用lrange的命令,列表数据的显示,关注列表,粉丝留言,留言评价等搜使用到了list,在博客系统中,每篇博文的评论也可以单独的存放到list集合里面

2)任务队列:list通常用于实现一个消息队列,并且可以保证先后顺序,不必像MYSQL那样通过orderby来指定先后顺序

案例1:热点新闻列表,来进行获取最新的5条热点新闻

1)查询5条列表新闻,并具备分页功能

2)后台管理员可以置顶指定新闻

 @RequestMapping("/GetMessage")
    @ResponseBody
    public List<String> GetMessage(){
        //1.初始化操作先进行向redis中存入热点新闻
        String key="baidu:topMessage:5";
        if(!template.hasKey(key)){
            template.opsForList().leftPush(key,"李佳伟拿到了offer");
            template.opsForList().leftPush(key,"我是好人呃");
            template.opsForList().leftPush(key,"好好学习天天向上");
            template.opsForList().leftPush(key,"学习新思想争做新青年");
            template.opsForList().leftPush(key,"我是中国人我爱我的祖国");
        }
        //2.获取到所有热点新闻
        List<String> list=template.opsForList().range(key,0,4);
        return list;
    }
    @RequestMapping("/InsertMessage")
    @ResponseBody
    public String InsertMessage(String message){
        String key="baidu:topMessage:5";
        template.opsForList().leftPush(key,message);
        return "热点新闻添加成功";
    }

案例二:生成物流信息

 @RequestMapping("/productMessage")
    @ResponseBody
    public String productMessage(int cardID){
        //1.生成要保存的物流信息的key
        String key="products:queue:execute"+cardID;
        if(!template.hasKey(key)) {
            //2.将各个时期的物流信息存放到redis里面
            template.opsForList().leftPush(key, "1商家发货,快递小哥上门取货");
            template.opsForList().leftPush(key, "2北京市到赤峰市");
            template.opsForList().leftPush(key, "3赤峰市到乌兰察布市");
            template.opsForList().leftPush(key, "4乌兰察布市到呼和浩特市");
            template.opsForList().leftPush(key, "已签收");
        }
        return "生成物流信息成功";
    }
    //2.更新物流进度
    @RequestMapping("/productYes")
    @ResponseBody
    public String productSuccess(int cardID) {
       String key="products:queue:execute"+cardID;
       String successkey="products:queue:success"+cardID;
       return template.opsForList().rightPopAndLeftPush(key,successkey);
    }
    //3.商家或者物流公司,这个快递还有多少项任务没有完成?
    @RequestMapping("/post")
    @ResponseBody
    public List<String> get(int cardID){
        String key="products:queue:execute"+cardID;
        return template.opsForList().range(key,0,-1);
    }
    //4.卖家现在商品到哪里了?
    @RequestMapping("get")
    @ResponseBody
    public List<String> post(int cardID){
        String key="products:queue:success"+cardID;
        return template.opsForList().range(key,0,-1);
    }

set集合的应用场景:

常常用于针对两个集合之间的数据做运算,进行差集,并集,补集的运算

1)利用集合操作可以取出不同圈子之间的交集,以便于非常方便的实现比如说共同关注,共同喜好,二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合里面

2)利用set集合的唯一性,可以统计网站中的所有独立IP,存储或者获取当天中的所有用户活跃列表

缓存的更新策略:

一)内存淘汰:不需要程序员自己来进行维护,是利用redis的内存淘汰策略,当内存不足的时候redis会自动淘汰掉部分数据,下次查询的时候会自动进行更新,可以自己进行配置,就可以清空一部分空间从而去存储新的数据了,程序员就不需要自己去考虑redis空间不足的问题

1.1)是否可以保证数据一致性呢?在一定程度上是可以的,当内存不足的时候redis一部分的数据给进行淘汰掉了,那么这一部分的数据在redis中不存在了,这个时候如果用户来查询这一部分的数据,因为redis中原有的数据已经被剔除,所以会自动查询数据库,并将数据库中的数据重新写入到redis里面?但是可控性非常差,因为我们不知道redis到底是淘汰掉的哪一部分的数据,甚至在内存充足的时候都不会淘汰

1.2)但是维护成本比较低,不需要程序原来自己进行维护

二)超时剔除:给缓存数据添加TTL时间,到期之后会自动删除缓存,下一次进行查询的时候会自动查询数据库

2.1)一致性:一般

2.2)维护性:一般

三)主动更新:编写业务逻辑,再修改数据库的同时进行更新缓存

2.1)一致性:不错

2.2)维护成本:高

低一致性请求:使用内存淘汰机制,长久不需要进行变化的元素

高一致性请求:使用超时剔除机制,需要进行频繁变动的元素

缓存穿透:缓存穿透是指客户端请求的数据在缓存中和数据库都不存在,那么这样的缓存永远也不会生效,那么最终导致这些请求都会被打到数据库里面

例如说根据userID来进行查询对应的用户信息,但是这个userID对应的用户在redis和数据库中都不存在(这个userID就是这个兄弟瞎编的),一旦这个哥们使用多线程循环传入不存在的userID很用可能造成服务大量访问数据库把服务器弄挂了;

解决方案:

1)直接向redis中存储一个空对象,一旦用户传入一个不存在的userID,redis直接存储一个空对象,下次这个哥们再带着这个无效的userID来进行访问,服务器直接返回一个null即可

优点:实现简单方便

缺点:

1.1)当用户传入100个不存在的userID,结果redis把他们都存放到数据库里面,那么会增加内存的开销,缓存了很多的垃圾数据但是我们可以设置一个TTL来进行解决,来防止用户恶意攻击

1.2)可能会造成短期的不一致问题:比如说A用户传递一个userID=5,但是这个userID在redis和数据库中都不存在,redis直接保存了一个空对象,设置过期时间是10min,但是在10min内B用户进行注册userID恰好是5,但是访问服务redis会直接返回一个null,但是通过控制TTL的时间来进行控制,只要TTL的时间设置的足够段就可以,或者在每一次用户更新数据的时候直接进行更新缓存就可以;

2)使用布隆过滤器:

优点:

1)相比于上面缓存空对象来说,内存占用非常少,不要存储多余的key 

2)实现复杂,布隆过滤器实现复杂

3)存在误判的可能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anaconda——使用原因及创建方法

Anaconda——使用原因 一、使用原因二、创建虚拟环境的方法1、打开Anaconda Navigator2、点进Anaconda Powershell Prompt3、输入创建命令 参考文章 一、使用原因 Anaconda包含很多库Anaconda可以 创建虚拟环境 &#xff0c;满足不同工程的要求的工具版本不一致问题&#xff0…

JavaScript中的异步函数(async/await)

1、async&#xff1a;异步的&#xff0c;await&#xff1a;等待。 一、作为async标识的函数与正常函数有两个区别&#xff1a; 1、当我们用async来声明一个函数的时候就说明这个函数是异步函数了&#xff0c;但事实上被声明的函数仍然是会在后面js之前求值&#xff0c;代码如…

四通道电容式智能门锁触摸芯片GT304L

智能门锁是指区别于传统机械锁的基础上改进的&#xff0c;在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 技术的复合型锁具。使用非机械钥匙作为用户识别ID的成熟技术&#xf…

分布式事务(CAP定理和BASE理论)

CAP定理 分布式系统无法同时满足这三个指标&#xff0c;这个结论就叫做CAP定理。 分布式系统三个指标: Consistency (一致性)Availability (可用性)Partition tolerance(分区容错性) Consistency (一致性) 用户访问分布式系统中的任意节点&#xff0c;得到的数据必须一致 A…

【最终截稿 | Springer 独立出版 | EI稳定检索】 2023年能源与环境工程国际会议(CoEEE 2023)

会议简介 Brief Introduction 2023年能源与环境工程国际会议(CoEEE 2023) 会议时间&#xff1a;2023年5月19日-21日 召开地点&#xff1a;瑞典马尔默 大会官网&#xff1a;www.coeee.org CoEEE 2023将围绕“能源与环境工程”的最新研究领域而展开&#xff0c;为研究人员、工程师…

拥有Java基础对比学习C#基本语法

文章目录 一、引包二、构造函数三、析构函数四、C#数据类型五、加框(boxing)和消框(unboxing&#xff09;六、运算符七、控制语句八、类的继承九、方法参数的种类十、操作符重载十一、this关键字十二、类的多态十三、抽象类和抽象方法十四、密封类和密封方法十五、接口十六、代…

Laf Assistant:云开发从未如此爽快!

原文链接&#xff1a;https://forum.laf.run/d/67 工欲善其事&#xff0c;必先利其器。在编写代码时&#xff0c;IDE 也是我们不可或缺的。它可以让我们更高效地完成代码编写&#xff0c;提高开发效率。因此&#xff0c;IDE 是我们编写代码中最亲密的伙伴之一。 虽然 Laf 云开…

关于并发编程与线程安全的思考与实践 | 京东云技术团队

作者&#xff1a;京东健康 张娜 一、并发编程的意义与挑战 并发编程的意义是充分的利用处理器的每一个核&#xff0c;以达到最高的处理性能&#xff0c;可以让程序运行的更快。而处理器也为了提高计算速率&#xff0c;作出了一系列优化&#xff0c;比如&#xff1a; 1、硬件…

MS8257N跨阻放大器pin对pin兼容OPA857

MS8257N 是一颗宽带、快速过载恢复时间、快速建立时间、跨阻增益可调、超低噪声的跨阻放大器&#xff0c;主要用于光电监测和各种高性能的光电系统。可pin对pin兼容OPA857。快速过载恢复特性和内部输入保护电路可以让信号从过载传输中快速恢复正常。两档可选跨阻增益保证了极高…

MySQL基础(十八)MySQL8其它新特性

1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本&#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&#xff0c;开发者对MySQL的源代码进行了重构&#xff0c;最突出的一点是MySQL Optimizer优化器进行了改进。不仅在速度上得…

【Redis】概述与安装

概述 Redis 是什么&#xff1f; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff1b; 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。 Redis 会周期性的把…

深入理解什么是 dp(dip)

文章目录 dp 的计算公式dp 计算的例子dp 的来历究竟什么是 dp dp 的计算公式 dp 是安卓 UI 开发中最常见的单位之一&#xff0c;它有一个别名 dip。dp 与 dip 是同一个意思。dp 指的是什么呢&#xff1f;官方的解释是 device independent pixels&#xff08;设备独立像素&#…

Golang 函数调用机制

在真实的内存里面是没有test和main栈区的&#xff0c;这里只是为了区分。这两个数据空间是独立的&#xff0c;但是同时都在栈区里面。 这里可以清楚的看到&#xff0c;虽然两个名字都叫n1&#xff0c;但是其实上都是独立的。就好比不同的教师里面坐着名字相同的人。 注意test…

软考A计划-重点考点-专题四(多媒体相关)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Mongodb 在工业场景下的数字解决方案

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

数字经济下的企业数字化转型

上周&#xff0c;由国家网信办、国家发改委、科技部、工信部、国务院国资委、福建省人民政府共同主办的第六届数字中国建设峰会在福州隆重开幕。 本届峰会以“加快数字中国建设&#xff0c;推进中国式现代化”为主题&#xff0c;集中展示数字中国建设最新成果和优秀实践案例&a…

uniapp实现微信小程序横屏适配问题demo效果(整理)

使用VMIN进行布局 先了解css3的两个属性vmax和vmin vmax 相对于视口的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax vmin 相对于视口的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin竖屏布局的时候&#xff0c;750rpx就是竖屏布局屏幕的宽度…

[前端]深浅拷贝

一、回顾变量类型 基础类型 boolean&#xff08;bool&#xff09; number string null undefined 引用类型 object ​ function ​ array 基本类型与引用类型的存储 基本类型一般存储在 栈 (栈小) 栈一旦确认 大小就固定 可能会造成溢出栈一般是先进后出用于存储…

数据库sql语句练习(二)

例题&#xff1a; ●检索出生年份比杜甫早的诗人 select name from poets where birth <( select birth from poets where name 杜甫’) 重点&#xff1a;ALL&#xff0c;SOME,ANY(对于any&#xff0c;有些系统用some) 使用all或者any时。必须同时使用比较运算符 注&…

Linux配置sftp用户访问指定目录

一、环境 开发环境&#xff1a;Win 10 -- 64位 服务环境&#xff1a;centos7 SSH&#xff1a;OpenSSH_7.4p1 二、新建sftp用户&#xff1a; 需要root权限执行-------------------------- 1.新建一个用户组 为了方便后面添加用户 groupadd sftp2.添加用户 useradd -g sf…