JAVA学习笔记----redis入门

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存贮值的空间

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352