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

Java学习笔记——redis入门(redis实战java代码)

mhr18 2024-11-13 11:07 31 浏览 0 评论

1.redis简介

在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题。

可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。

为了克服上述的问题,Java Web项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。

Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。

Redis 在 Java Web 中的应用

Redis 在 Java Web 主要有两个应用场景:

存储缓存用的数据;

需要高速读/写的场合使用它快速读/写;

在日常对数据库的访问中,读操作的次数远超写操作,比例大概在 1:9 到 3:7,所以需要读的可能性是比写的可能大得多的。当我们使用SQL语句去数据库进行读写操作时,数据库就会去磁盘把对应的数据索引取回来,这是一个相对较慢的过程。

如果我们把数据放在 Redis 中,也就是直接放在内存之中,让服务端直接去读取内存中的数据,那么这样速度明显就会快上不少,并且会极大减小数据库的压力,但是使用内存进行数据存储开销也是比较大的,限于成本的原因,一般我们只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。

在如今的互联网中,越来越多的存在高并发的情况,比如天猫双11、抢红包、抢演唱会门票等,这些场合都是在某一个瞬间或者是某一个短暂的时刻有成千上万的请求到达服务器,如果单纯的使用数据库来进行处理,就算不崩,也会很慢的,轻则造成用户体验极差用户量流失,重则数据库瘫痪,服务宕机,而这样的场合都是不允许的!


2.redis的下载安装

网站:https://github.com/microsoftarchive/redis/tags


3.redis的基本操作

String类型:

存储结构:

redis自身是一个Map,其中所有的数据都是采用key:value的形式存储(key value)

String类型说的是右边的value类型是string类型

基本操作:

添加/修改数据:set key value

获取数据:get key

删除数据:del key

添加/修改多个数据:mset key1 value1 key2 value2

获取多个数据:mget key1 key2 ...

获取数据字符个数:strlen key

追加信息到原始信息的尾部:append key value

扩展操作:

(业务场景:分表时保证主键唯一)

设置数值增加指定范围:incr key

增加指定大小:incrby key increment

设置数值减少指定范围:decr key

减少指定大小:decrby key increment

(业务场景:限时投票)

设置数据具有指定的生命周期:setex key seconds value

注意:

a.单数据操作比多数据操作在一定程度上效率更高

b.string在redis内部默认是一个字符串,当遇到增减类型incr,decr时会转成数值类型进行计算

c.redis所有操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的。因此无需考虑并发带来的影响

d.按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值类型上限,将会报错

string类型的应用场景:

a.微博关注量(在redis中以用户主键和属性作为key)

user:id:123:fans 1232

user:id:123 {id:123,name:吴京,fans:121321}

hash类型:

思考:string类型在取值的时候很方便,但是在更新的时候会显得笨重。

存储结构:一个存储空间保存多个键值对数据

例如:key field1 value1 field1 value2

基本操作:

增加修改数据:hset key field value

获取:hget key field/hgetall key

删除数据:hdel key field

添加/修改多个数据:hmset key field1 value1 field2 value2

获取多个数据:hmget key field1 field2

获取hash表中字段的数量:hlen key

获取哈希表中是否存在指定的字段:hexists key field(如果存在field值返回1,不存在返回0)

扩展操作:

获取哈希表中所有的字段名或字段值:hkeys key/hvals key

设置指定字段增加范围:hincrby key increment

有field不让修改,没有加上:hsetnx key field value

注意事项:

a.hash类型的value只能存字符串,不允许存其他类型的值

b.每个hash可以存储2^32-1个键值对

c.hash类型十分贴近对象的数据存储形式,可以灵活的增删改查对象属性,但hash设计的初衷不是为了存储大量对象的,因此不可将hash作为对象列表使用。

应用场景:

电商购物车设计与实现

购物车商品 商品id:field

商品数量 value

购物车全部商品 hlen获取总量

以用户id作为key,商品编号作为field,数量作为为value进行存储

商品抢购(双11,某商家推出A产品100抢购数量,B产品50,C产品10)

以商家id作为key

参与抢购商品的id作为field

商品数量作为value

以降值的方式控制数量

思考:string和hash都可以存储对象,分别的优缺点?(String偏向整体性,hash偏向灵活性)


list类型

数据存储需求:存储多个数据,并对存储空间进行顺序的区分

存储结构:一个存储空间保存多个数据,并且可通过顺序获取空间内容,底层使用的是双向链表结构。

基本操作:

增加修改数据 lpush key value1[value2](左进)/rpush key value1[value2](右进)

获取数据 lrange key start

根据下表获取元素 lindex key index

获取长度 llen

获取并移除数据 lpop key/rpop key

扩展操作:

规定时间内获取并移除数据 blpop key timeout/brpop key timeout(阻塞数据获取)

业务场景:

微信 朋友圈点赞,顺序显示点赞好友信息

==》key 朋友圈id value 点赞人

中间有人取消点赞

==》 lrem key count value 删除指定value的数量count

企业运营过程中,系统将产生大量的运营数据,如果有多态服务器,如何保证信息按统一顺序输出?

==》将多态服务器的信息日志,保存到redis中

注意事项:

a.list中保存的数据都是String类型的,数据总容量有限,最多2^32-1个元素

b.list具有索引的概念,操作数据时通常以队列的形式进行进出操作

c.获取全部数据操作结束索引设置为-1

set类型

思考:存储大量的数据,在查询方面提供更高效的效率?

存储结构:与hash存储结构完全相同,仅存键值,不存value,并且键值不允许重复。

基本操作:

添加数据 sadd key member1[menmber2]

获取数据 smembers key

删除数据 srem key member1[menmber2]

获取集合数据总量 scard key

判断是否包含指定数据 sismember key member1

扩展操作:

随机获取集合中指定数量的数据 srandmember key[count]

随机获取集合中的某个数据并将该数据移除集合 spop key

两个集合的交,并,差集 sinter key1[key2]/sunion key1[key2]/sdiff key1[key2]

两个集合的交,并,差集存储到指定集合 sinterstore key1[key2]/sunionstore key1[key2]/sdiffstore key1[key2]

业务场景:

1.今日头条在使用时会让用户设置爱好内容,但是后期为了增加用户的活跃度,必须让用户对其他信息也产生兴趣,如何向用户随机推送其他信息呢?

==》系统分析各个分类中最新或者最热的信息,保存到set集合中,然后随机挑选其中的部分信息,配合用户关注的信息分类展示全部信息

2.陌陌为了促进用户交流,如何快速为用户积累跟过的好友?qq推荐共同的好友?

3.黑白名单

信息类网站追求高访问量,通过爬虫快速获取信息,转成商业辛纳希出售,例如:第三方购票软件(获取余票信息),电商刷好评(获取用户信息)

黑名单:屏蔽此类信息

白名单:可访问用户群体

==》将用户信息与黑名单的用户信息比对,在黑名单中不允许访问,不在放行

注意事项:

set类型不允许数据重复

set虽然与hash结构相同,但是无法启用hash存贮值的空间

相关推荐

Dubai's AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East's Silicon Gateway

AI-generatedimageAsianFin--Dubaiisrapidlytransformingitselffromadesertoilhubintoaglob...

OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs

TMTPOST--OpenAIisescalatingthepricewarinlargelanguagemodel(LLM)whileseekingpartnershi...

黄仁勋说AI Agent才是未来!但究竟有些啥影响?

,抓住风口(iOS用户请用电脑端打开小程序)本期要点:详解2025年大热点你好,我是王煜全,这里是王煜全要闻评论。最近,有个词被各个科技大佬反复提及——AIAgent,智能体。黄仁勋在CES展的发布...

商城微服务项目组件搭建(五)——Kafka、Tomcat等安装部署

1、本文属于mini商城系列文档的第0章,由于篇幅原因,这篇文章拆成了6部分,本文属于第5部分2、mini商城项目详细文档及代码见CSDN:https://blog.csdn.net/Eclipse_...

Python+Appium环境搭建与自动化教程

以下是保姆级教程,手把手教你搭建Python+Appium环境并实现简单的APP自动化测试:一、环境搭建(Windows系统)1.安装Python访问Python官网下载最新版(建议...

零配置入门:用VSCode写Java代码的正确姿

一、环境准备:安装JDK,让电脑“听懂”Java目标:安装Java开发工具包(JDK),配置环境变量下载JDKJava程序需要JDK(JavaDevelopmentKit)才能运行和编译。以下是两...

Mycat的搭建以及配置与启动(mycat2)

1、首先开启服务器相关端口firewall-cmd--permanent--add-port=9066/tcpfirewall-cmd--permanent--add-port=80...

kubernetes 部署mysql应用(k8s mysql部署)

这边仅用于测试环境,一般生产环境mysql不建议使用容器部署。这里假设安装mysql版本为mysql8.0.33一、创建MySQL配置(ConfigMap)#mysql-config.yaml...

Spring Data Jpa 介绍和详细入门案例搭建

1.SpringDataJPA的概念在介绍SpringDataJPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射(Object-Re...

量子点格棋上线!“天衍”邀您执子入局

你是否能在策略上战胜量子智能?这不仅是一场博弈更是一次量子智力的较量——量子点格棋正式上线!试试你能否赢下这场量子智局!游戏玩法详解一笔一画间的策略博弈游戏目标:封闭格子、争夺领地点格棋的基本目标是利...

美国将与阿联酋合作建立海外最大的人工智能数据中心

当地时间5月15日,美国白宫宣布与阿联酋合作建立人工智能数据中心园区,据称这是美国以外最大的人工智能园区。阿布扎比政府支持的阿联酋公司G42及多家美国公司将在阿布扎比合作建造容量为5GW的数据中心,占...

盘后股价大涨近8%!甲骨文的业绩及指引超预期?

近期,美股的AI概念股迎来了一波上升行情,微软(MSFT.US)频创新高,英伟达(NVDA.US)、台积电(TSM.US)、博通(AVGO.US)、甲骨文(ORCL.US)等多股亦出现显著上涨。而从基...

甲骨文预计新财年云基础设施营收将涨超70%,盘后一度涨8% | 财报见闻

甲骨文(Oracle)周三盘后公布财报显示,该公司第四财季业绩超预期,虽然云基建略微逊于预期,但管理层预计2026财年云基础设施营收预计将增长超过70%,同时资本支出继上年猛增三倍后,新财年将继续增至...

Springboot数据访问(整合MongoDB)

SpringBoot整合MongoDB基本概念MongoDB与我们之前熟知的关系型数据库(MySQL、Oracle)不同,MongoDB是一个文档数据库,它具有所需的可伸缩性和灵活性,以及所需的查询和...

Linux环境下,Jmeter压力测试的搭建及报错解决方法

概述  Jmeter最早是为了测试Tomcat的前身JServ的执行效率而诞生的。到目前为止,它的最新版本是5.3,其测试能力也不再仅仅只局限于对于Web服务器的测试,而是涵盖了数据库、JM...

取消回复欢迎 发表评论: