Java学习笔记——redis入门(redis实战java代码)
mhr18 2024-11-13 11:07 12 浏览 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存贮值的空间
相关推荐
- MySQL数据库中,数据量越来越大,有什么具体的优化方案么?
-
个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发、运维的复杂度会直线上升,而大多数公司和开发人员是欠缺这种能力的。所以MySQL中几百万甚至小几千万的表,先考虑做单表的优化。...
- Redis的Bitmap(位图):签到打卡、用户在线状态,用它一目了然
-
你是不是每天打开APP,第一时间就是去“签到打卡”?或者在社交软件里,看到你的朋友头像旁边亮着“在线”的绿灯?这些看似简单的功能背后,都隐藏着一个有趣而高效的数据结构。如果让你来设计一个签到系统:用户...
- 想知道有多少人看了你的文章?Redis HyperLogLog几KB就搞定!
-
作为一名内容创作者,你每天最期待的,除了文章阅读量蹭蹭上涨,是不是还特别想知道,到底有多少个“独立用户”阅读了你的文章?这个数字,我们通常称为“UV”(UniqueVisitors),它比总阅读量更...
- Redis的“HyperLogLog”:统计网站日活用户,省内存又高效的神器
-
你可能从未听过这个拗口的名字——“HyperLogLog”,它听起来就像是某个高深莫测的数学公式。但请相信我,理解它的核心思想并不难,而且一旦你掌握了它,你会发现它在处理大数据统计问题时,简直就是“救...
- 阿里云国际站:为什么我的云服务器运行缓慢?
-
本文由【云老大】TG@yunlaoda360撰写一、网络性能瓶颈带宽不足现象:上传/下载速度慢,远程连接卡顿。排查:通过阿里云控制台查看网络流量峰值是否接近带宽上限34。解决:升级带宽(如从1M提...
- Java 近期新闻:Jakarta EE 11和Spring AI更新、WildFly 36.0 Beta、Infinispan
-
作者|MichaelRedlich译者|明知山策划|丁晓昀OpenJDKJEP503(移除32位x86移植版本)已从“ProposedtoTarget”状态进入到“T...
- 腾讯云国际站:怎样设置自动伸缩应对流量高峰?
-
云计算平台服务以阿里云为例:开通服务与创建伸缩组:登录阿里云控制台,找到弹性伸缩服务并开通。创建伸缩组时,选择地域与可用区,定义伸缩组内最小/最大实例数,绑定已有VPC虚拟交换机。实例模板需...
- 【案例分享】如何利用京东云建设高可用业务架构
-
本文以2022年一个实际项目为基础,来演示在京东云上构建高可用业务的整个过程。公有云及私有云客户可通过使用京东云的弹性IAAS、PAAS服务,创建高可用、高弹性、高可扩展、高安全的云上业务环境,提升业...
- Spring Security在前后端分离项目中的使用
-
1文章导读SpringSecurity是Spring家族中的一个安全管理框架,可以和SpringBoot项目很方便的集成。SpringSecurity框架的两大核心功能:认证和授权认证:...
- Redis与Java集成的最佳实践
-
Redis与Java集成的最佳实践在当今互联网飞速发展的时代,缓存技术的重要性毋庸置疑。Redis作为一款高性能的分布式缓存数据库,与Java语言的结合更是如虎添翼。今天,我们就来聊聊Redis与Ja...
- Redis在Java项目中的应用与数据持久化
-
Redis在Java项目中的应用与数据持久化Redis简介:为什么我们需要它?在Java项目中,Redis就像一位不知疲倦的快跑选手,总能在关键时刻挺身而出。作为一个内存数据库,它在处理高并发请求时表...
- Redis 集群最大节点个数是多少?
-
Redis集群最大节点个数取决于Redis的哈希槽数量,因为每个节点可以负责多个哈希槽。在Redis3.0之前,Redis集群最多支持16384个哈希槽,因此最大节点数为16384个。但是在Redi...
- Java开发岗面试宝典:分布式相关问答详解
-
今天千锋广州Java小编就给大家分享一些就业面试宝典之分布式相关问题,一起来看看吧!1.Redis和Memcache的区别?1、存储方式Memecache把数据全部存在内存之中,断电后会挂掉,数据不...
- 当Redis内存不足时,除了加内存,还有哪些曲线救国的办法?
-
作为“速度之王”的Redis,其高性能的秘密武器之一就是将数据存储在内存中。然而,内存资源是有限且昂贵的。当你的Redis实例开始告警“内存不足”,或者写入请求被阻塞时,最直接的解决方案似乎就是“加内...
- 商品详情页那么多信息,Redis的“哈希”如何优雅存储?
-
你每天网购时,无论是打开淘宝、京东还是拼多多,看到的商品详情页都琳琅满目:商品名称、价格、库存、图片、描述、评价数量、销量。这些信息加起来,多的惊人。那么问题来了:这些海量的商品信息,程序是去哪里取出...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- MySQL数据库中,数据量越来越大,有什么具体的优化方案么?
- Redis的Bitmap(位图):签到打卡、用户在线状态,用它一目了然
- 想知道有多少人看了你的文章?Redis HyperLogLog几KB就搞定!
- Redis的“HyperLogLog”:统计网站日活用户,省内存又高效的神器
- 阿里云国际站:为什么我的云服务器运行缓慢?
- Java 近期新闻:Jakarta EE 11和Spring AI更新、WildFly 36.0 Beta、Infinispan
- 腾讯云国际站:怎样设置自动伸缩应对流量高峰?
- 【案例分享】如何利用京东云建设高可用业务架构
- Spring Security在前后端分离项目中的使用
- Redis与Java集成的最佳实践
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)