Redis-第八章节-应用场景
目录
- 概述
- 详解
1、概述
Redis支持五种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)。
2、详解
1、String(字符串)
定义: String 是 redis 最基本的类型,一个 key 对应一个 value。String 类型是二进制安全的。因为 string 底层的实现是简单动态字符串 sds,是可以修改字符串。
应用场景: 单值缓存、对象缓存、分布式锁、常规计数(粉丝数量、评论数量)、分布式session共享、分布式全局序列号。
具体实现:
单值缓存:
set key value
get key
对象缓存:
set user:1 value(json格式数据)
mset user:1:name tsingli user:1:balance 1888
mget user:1:name user:1:balance
常规计数器:
incr article:readcount:{文章id}
get article:readcount:{文章id}
分布式系统全局序列号:
incrby orderid 1000 # redis批量生成序列号提升性能
分布式锁:
# 相关操作
线程1: setnx product:1001 true # 返回1代表获取锁成功
线程2: setnx product:1001 true # 返回0代表获取锁失败
。。。执行业务操作
del product:1001 # 执行完业务释放锁
set product:1001 true ex 10 nx # 防止程序意外终止导致死锁
# 案例
setnx product:1001 true
1.查询商品1001的库存
2.减库存
3.重新把减完剩余的库存更新回数据库
del product:1001
setnx 如果插入的key一样不会对数据有任何操作,如果第二次对库存再进行减对的话就返回错误。
2、Hash(哈希)
定义: Hash是一个键值对集合。他相当于java中的双重map。<key,<filed,value>>。
应用场景: 购物车。
具体实现:
购物车:
# 说明:
# 用户id为1001,商品的编码是10088。
# 用户id为key,商品id为field,商品数量为value。
# 案例:
# 添加商品:
hset cart:1001 10088 1
# 增加数量:
hincrby cart:1001 10088 1
# 商品总数:
hlen cart:1001
# 删除商品:
hdel cart:1001 10088
# 获取购物车所有商品:
hgetall cart:1001
3、List(列表)
定义: 列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素在列表的头部或者尾部。
应用场景: Stack(栈)= LPUSH + LPOP -> FILO //先进后出、Queue(队列)= LPUSH + RPOP //先进先出、Blocking MQ(阻塞队列)= LPUSH + BRPOP //消息队列、微博、微信公众号消息流。
具体实现:
微博和微信公众号消息流:
# 李雷发微博,消息id为10018
lpush msg:111111 10018
# 韩梅梅车发微博,消息id为10086
lpush msg:111111 10086
# 查看最新微博消息
lrange msg:11111 0 5 //0至5条微博消息。
4、Set(集合)
定义: Set 是 string 类型的无序集合。
应用场景: 微信抽奖小程序、微信微博点赞、收藏、标签、关注模型,就是可能认识的人的关系。
具体实现:
微信抽奖:
# 点击参与抽奖加入集合
sadd key {userId}
# 查看参与抽奖的所有用户
smembers key
# 抽取count名中奖者(1) // srandmember不会将元素从集合中删除
srandmember key [count] //抽取两名中奖者 srandmember act:1008 2
# 抽取count名中奖者(2) // SPOP会将元素从集合中删除
spop key 2
微信微博点赞、收藏、标签:
# 点赞
sadd like:{消息ID} {用户id}
# 取消点赞
srem like:{消息ID} {用户id}
# 检查用户是否点过赞
sismember like:{消息ID} {用户id}
# 获取点赞的用户列表
smembers like:{消息ID}
# 获取点赞的用户树
scard like:{消息ID}
5、Zset(有序集合)
定义: zset和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个dobule类型的分数,redis正是通过分数为集合成员进行从小到大的排序,zset的成员是唯一的但是分数可以重复。
Redis-第八章节-应用场景的更多相关文章
- Redis(八) LRU Cache
Redis(八)-- LRU Cache 在计算机中缓存可谓无所不在,无论还是应用还是操作系统中,为了性能都需要做缓存.然缓存必然与缓存算法息息相关,LRU就是其中之一.笔者在最先接触LRU是大学学习 ...
- 国内外三个不同领域巨头分享的Redis实战经验及使用场景
Redis不是比较成熟的memcache或者Mysql的替代品,是对于大型互联网类应用在架构上很好的补充.现在有越来越多的应用也在纷纷基于Redis做架构的改造.首先简单公布一下Redis平台实际情况 ...
- Redis作为消息队列服务场景应用案例
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例 一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景
随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...
- 一:Redis的7个应用场景
Redis的7个应用场景 一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相 ...
- Redis实战经验及使用场景
随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...
- 细说Redis(一)之 Redis的数据结构与应用场景
这一篇文章主要介绍Redis的数据结构与应用场景 NOSQL之Redis Redis是一款由key-value存储的软件.说起NOSQL,有文档型.键值型.列型存储.图形数据库.其中,在简单的读写性能 ...
- Redis(八)-- Redis分布式锁实现
一.使用分布式锁要满足的几个条件 系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现) 共享资源(各个系统访问同一个资源,资源的载体可 ...
- Redis常见7种使用场景(PHP)
转发:https://www.jianshu.com/p/2f3add45351b Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并 ...
随机推荐
- 简单的DbContext工厂类(EFCore)
前言 根据appsettings.json的中配置的数据库类型,使用工厂模式创建DbContext 代码实现 appsettings.json中的配置项 //使用的数据库类型 "Server ...
- VMware中安装Ubuntu后,安装VMwareTools提示“Not enough free space to extract VMwareTools-10.3.10-13959562.tar.gz”的解决办法
将加载后的Vmware Tools中的*.tar.gz文件复制到桌面后提取,否则会报错:
- How to kill go routine?
How to kill go routine? https://stackoverflow.com/questions/37997608/kill-a-method-in-an-infinite-lo ...
- (Sql Server)存储过程(转载)
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- flutter--Dart基础语法(一)
一.前言 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,Flutter 开源.免费,拥有宽松的开源协议,支持移动.Web.桌面和嵌入式平台. ...
- Ajax原理,技术封装与完整示例代码
在做项目和学习的时候,经常用到Ajax的相关技术,但是这方面的技术总是运用的不是十分好,就寻找相关博客来学习加深Ajax技术相关. 一.Ajax简介 二.同步.异步传输区别 2.1 异步传输 2.2 ...
- Hbase 表的设计原则 ————总结
1.列族的数量及列族的势 建议将HBase列族的数量设置的越少越好.当强,对于两个或两个以上的列族HBase并不能处理的很好.这是由于HBase的Flushing和压缩是基于Region的.当一个列族 ...
- scala的隐式转换学习总结(详细)
一,隐式转换函数 1, 格式, implicit def 函数名(参数):返回值类型={ //函数体 //返回值 } 2,例子: //导入对应的规则类,以免出现警告 scala> import ...
- 关于webservice实现web接口
package service; import java.util.List; import javax.jws.WebMethod;import javax.jws.WebService; /** ...
- 开发环境管理利器Vagrant
引言 不知道你是否经历过,开发环境与生产环境不一致.Windows开发和Linux上的包效果不一样.在我这运行时好的啊 等等等问题,那有没有解决方法呢? 答案就是Vagrant.Docker 1.简介 ...