redis的五种数据类型和使用场景

string类型

string类型多用于缓存

set  key  value(value可以为json字符串)

setnx多用于分布式锁(后面详细整理)

计数器

incr article:{文章id}:readcount
get article:{文章id}:readcount

web集群session共享

redis实现session共享

https://www.cnblogs.com/cxx8181602/p/9759645.html

分布式系统全局序列号(分库分表的主键可以使用此方法 批量生成id会提升性能)

incrby orderid 1000

setbit的位运算

https://www.jianshu.com/p/3a30f58ba62c

hash类型

对象存储

mset user {user_id}:name test {user_id}:age 12
hget user {user_id}:name {user_id}:age

因为redis是单线程操作,有一个非常大的忌讳就是不要让key太大,会导致执行该命令时间非常长,会阻塞线程,所以hash不要当作数据库来用,只是存储一些热数据就行

在实际应用中,可以给hash的key来分段,有一点类似于数据库分表那种思路,把数据存储在不同的key中,切记,千万不要让一个key过大

可以用来实现购物车功能

实现方式如下图

  • 以用户id为key
  • 以商品id为field
  • 商品数量为value

    购物车操作流程
  • 添加商品 hset cart:123 10010 1(123为user_id 10010为商品id)
  • 增加数量 hincrby cart:123 10010 1
  • 商品总数 hlen cart:123
  • 删除商品 hdel cart:123 10010
  • 获取购物车所有商品 hgetall cart:123

和string相比的优缺点

优点

  • 同类数据归档,存储比较方便
  • 比string消耗的cpu更小
  • 比string更节省存储空间

缺点

  • 过期功能不能用在field上,只能用在key上
  • 不适合在集群架构下大规模使用(集群数据都是分片处理的,目的是让数据分段均匀的存储,比如把user表的信息都存在hash中,就会导致那个key非常大,这样就会导致某一个redis机器上的数据非常大,导致了数据倾斜)

list类型

可以实现常见的栈和队列的数据结构,如下图

阻塞队列

Blocking MQ(阻塞队列) = LPUSH + BRPOP( BRPOP会一直等待)

微信,微博消息流

博主发消息直接发到粉丝的信息list中,粉丝直接读取即可,但是这种只适合粉丝比较少的情况

set类型应用场景

微信抽奖活动

  • 点击参与抽奖 sadd key {user_id}
  • 查看所有抽奖用户 smambers key
  • 抽取count名中奖者 srandmember key count 或者 spop key count(spop从集合中取出数据后会删除掉 适合不能重复抽奖的场景)

    ** 微信微博点赞的实现**

  • msg_id为朋友圈id user_id为点赞操作的用户的id
  • 点赞: sadd like:{msg_id} {user_id}
  • 取消点赞: srem like:{msg_id} {user_id}
  • 检查用户是否点过赞 : sismember like:{msg_id} {user_id}
  • 获取点赞用户列表: smembers like:{msg_id}
  • 获取点赞用户数: scard like:{msg_id}

可以做一些简单的推荐

用交集 差集等功能,做一些比较简单的推荐

  • sinter
  • sunion
  • sdiff

注意 交集 差集运算速度比较慢,如果使用的话 最好用单独的实例

zset

实现新闻排行榜

  • 点击新闻 zincrby news:date 1 news_id
  • 展示当日排行前10 zrevrange news:date 0 9 withscores
  • 展示7天排行榜
  • datalist为7天的日期 逐个枚举
  • zunionstore news:datelist 7 news:date1 news:date2 。。。。news:date7
  • 展示7日排行前10
  • ZRANGE news:datelist 0 9 WITHSCORES

关注我的技术公众号,每周都有优质技术文章推送。

微信扫一扫下方二维码即可关注:

redis五种数据类型的应用的更多相关文章

  1. redis五种数据类型的使用(zz)

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  2. redis五种数据类型的使用

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  3. redis五种数据类型的使用场景

    string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  4. Redis五种数据类型-设置key的过期时间

    1.redis命令客户端 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> #是否运行着 127.0.0.1:6379> ping PON ...

  5. (转) 淘淘商城系列——Redis五种数据类型介绍

    http://blog.csdn.net/yerenyuan_pku/article/details/72855562 Redis支持五种数据类型:string(字符串),hash(哈希),list( ...

  6. Redis五种数据类型应用场景

    目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...

  7. redis 五种数据类型

    前言 前面学会了单机, 学会了集群, 但是redis咋用啊? 或者说, redis支持哪些数据类型呢? 常用的有五种: String , Hash, List, Set, zset(SortedSet ...

  8. 《闲扯Redis三》Redis五种数据类型之List型

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

  9. 《闲扯Redis六》Redis五种数据类型之Hash型

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

随机推荐

  1. nginx常用功能和配置

    nginx常用功能和配置 1.nginx常用功能和配置 1.1 限流 1.2 压力测试工具--Ab 1.2.1安装 1.2.2 测试 1.2.3 返回值 1.3 limit_conn_zone 1.4 ...

  2. GitLab开发流程图示、Git命令一张图

    GitLab开发流程图示.Git命令一张图 一.GitLab开发流程图示 二.Git命令一张图 作图工具:ProcessOn 一.GitLab开发流程图示 二.Git命令一张图

  3. js创建javaMap

    /** * Simple Map * var m = new Map(); * m.put('key','value'); * var v_otherMap = v_m.toMapString();* ...

  4. H3C交换机DHCP配置

    1.dhcp配置 dhcp enable:开启dhcp功能 dhcp server forbidden-ip 10.1.130.2 10.1.130.10----排除dhcp的一些地址 dhcp se ...

  5. Java 复习整理day08

    package com.it.demo02_lambda; //接口, 表示动物. //public abstract class Animal { //报错, Lambda表达式只针对于接口有效 p ...

  6. 西南民族大学第十二届程序设计竞赛(同步赛) A.逃出机房 (bfs)

    题意:有来两个人A和B,A追B,A和B每次向上下左右移动一个单位,一共有两扇门,问A是否可以追上B(在门口追上也算合法). 题解:当时看题意说在门口也算?就觉得是判断两个人到门口的时间,对他们两个人分 ...

  7. Codeforces Round #570 (Div. 3) E. Subsequences (easy version) (搜索,STL)

    题意:有一长度为\(n\)的字符串,要求得到\(k\)不同的它的子序列(可以是空串),每个子序列有\(|n|-|t|\)的贡献,求合法情况下的最小贡献. 题解:直接撸个爆搜找出所有子序列然后放到set ...

  8. Codeforces Round #547 (Div. 3) E. Superhero Battle (数学)

    题意:有一个HP为\(h\)的大怪兽,你需要轮流进行\(i\)次操作.每次可以使\(h+=d_i\)(\(d_i\)有正有负),当第\(n\)次操作完成后,再从第一次开始,问能否使得怪兽的HP变为\( ...

  9. Python进阶丨如何创建你的第一个Python元类?

    摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...

  10. SpringBoot 中使用 Swagger2 出现 whitelabel page error 解决方法

    今天使用Swagger最新版,在pom.xml引入 <dependency> <groupId>io.springfox</groupId> <artifac ...