小飞知识库 | YeLu🤠MiLu🤪 小飞知识库 | YeLu🤠MiLu🤪
  • 函数式编程
  • Spring
  • SpringMVC
  • SpringBoot
  • SpringCloud
  • Mybatis
  • JVM
  • JUC并发编程
  • 设计模式
  • 单元测试
  • Redis
  • RabbitMQ
  • mysql
  • oracle
  • linux
  • nginx
  • docker
  • elasticSearch
  • windows
  • 虚拟机
  • 监控系统
  • https
  • 内网穿透
  • 前端文章

    • JavaScript
  • 页面

    • HTML
    • CSS
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 版本管理

    • Git笔记
  • 项目构建

    • maven
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • JAR包相关
  • 关于
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YeLu

爱技术的YeLu🤠
  • 函数式编程
  • Spring
  • SpringMVC
  • SpringBoot
  • SpringCloud
  • Mybatis
  • JVM
  • JUC并发编程
  • 设计模式
  • 单元测试
  • Redis
  • RabbitMQ
  • mysql
  • oracle
  • linux
  • nginx
  • docker
  • elasticSearch
  • windows
  • 虚拟机
  • 监控系统
  • https
  • 内网穿透
  • 前端文章

    • JavaScript
  • 页面

    • HTML
    • CSS
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • TypeScript
    • JS设计模式总结
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 版本管理

    • Git笔记
  • 项目构建

    • maven
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • JAR包相关
  • 关于
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Redis

    • redis介绍

    • redis安装

    • redis基础

      • 五种数据类型
      • 基本命令
        • key相关
        • String类型相关
        • Set存对象问题
        • setnx的适用场景
        • incr和incrby适用场景
        • Hash结构命令相关
          • hset/hget的适用场景
          • 综合的应用场景
          • 添加购物车的数据
        • List结构相关命令
          • 适用场景
        • Set结构相关命令
        • sorted set相关的命令
        • 发布订阅模型
        • 事务问题(不能保持原子性)
        • 实现计数器
      • 持久化模式
      • 数据淘汰策略
    • redis进阶

  • 缓存
  • Redis
  • redis基础
YeLu🤠
2023-04-04
目录

基本命令

# key相关

keys *  :查看当前数据库中 所有的key的名字  开发中一般不用  效率低
注意:redis中默认有16个数据库   数据库的下标默认是  0-15  默认数据是存放到0号数据库中的
如何进行数据库的切换呢?
select 下标
del key:删除某一个key   这个命令可以用在缓存的同步中 1表示成功0表示删除失败  
exists key:判断一个key在Redis中是否存在  (场景:判断缓存是否存在、做用户身份校验 判断token是否存在)
expire key  时间(默认是秒):给这个key设置过期时间   场景(用户登陆成功 给token设置个过期时间) 大量数据同时过期雪崩效应
ttl key :获取一个key还剩余的过期的时间 查看一个key过期时间
move key 数据库的下标:这个表示的意思是:将这个key-value移动到另外一个数据库
randomkey : 随机获取一个key  (场景:这个经常用来做抽奖用)
1
2
3
4
5
6
7
8
9
10

# String类型相关

set key value :给数据库添加一个键值对
get key :获取一个key的值
getset key value:先获取这个key的值  然后再给这个key设置值   (没找到过场景)
mset key value key value :一次性设置多个值
mget key key :一次性 获取多个值
setnx  key  值 :如果这个key不存在 那么就设置值  否则不设(如果key存在就不设置值)
1
2
3
4
5
6

# Set存对象问题

-- 怎么将这个数据库的数据 存储到 Redis中呢?
-- 存储数据
set user:1:userName oooo
set user:1:password oooooo
-- 这个语句可以做一个改良
mset user:1:userName oooo   user:1:password oooooo
mget user:1:userName  user:1:password
1
2
3
4
5
6
7

# setnx的适用场景

# incr和incrby适用场景

这个场景使用incr这个命令怎么来设计呢?

set weixin:dz:微信的这一条信息的id 0

incr weixin:dz:微信的这一条信息的id

set weixin:pl:count:微信这一条信息的id 0

incr weixin:pl:count:微信这一条信息的id

取消点赞

decr weixin:dz:微信的这一条信息的id

如果是批处理 那么 取消几个就可以了 decrby key step

# Hash结构命令相关

hset 名字  key  value :给这个hash结构设置一个键值对
hget 名字  key :获取某一个key的值
hlen 名字 :获取这个集合中数据的条目数
hgetall 名字 :获取这个集合中 所有的数据
hincrby 名字  键 step :让某一个数据自增(步长就是自增的数据)
hvals 名字 :获取这个集合中 所有的value
1
2
3
4
5
6

# hset/hget的适用场景

hset user 1:userName oooo hset user 1:password oooo hget user 1:userName hmset user 1:userName oooo 1:password oooo hmget user 1:userName 1:password (获取多条指定的数据)

# 综合的应用场景

# 添加购物车的数据

hset cards:用户的id 商品的id  商品的数量  -------> hset card:100 70 1
hincrby card:100 70 1---------------------->点击了这里的+号
hdecrby card:100 70 1--------------------->表示的是点击了-号
hdel card:100 70  --------------------------> 点击了商品后面的删除按钮
hgetall card:100  --------------------------->这个就表示的是点击了全选
hlen card:100     ----------------------------->这个就表示的是 选中了多少件商品
1
2
3
4
5
6

# List结构相关命令

lpush 名字 值
lpop 名字
rpush 名字 值
rpop 名字
lrange 名字 开始位置  结束位置  :获取开始位置  到结束位置的值 位置是下标(正向索引和反向索引)
blpop 名字   从左边位置弹出一个数据 如果左边位置没有数据  那么将处于等待状态(还可以给一个等待时间)
brpop 名字   将从最右边的位置 弹出一条数据   如果最右边没有数据  那么将处于等待状态
1
2
3
4
5
6
7

# 适用场景

现在某人关注了 mobtech 和 微博开放平台

你想这样一个问题:微博上 咋们如果关注了这两个平台 那么是不是我们只是接受我们关注的平台的数据

假设你是这个程序设计人员 你在发送消息的时候你只是 发送给 关注了 mobtech以及 微博公众平台的这些用户

lpush weibo-develop:msg:用户id 消息id ---------> lpush wiebo-develop:msg:100(用户id) 890(消息id)

打开微博页面 显示20条数据

lrange wiebo-develop:msg:100(用户id) 0 20 只显示最新的20条数据

lpush + brpop 可以构成阻塞队列

# Set结构相关命令

sadd 名字  值、值 :向这个集合中添加值
srem 名字  值:删除一个指定值的数据
sismember 名字 值:判断一个值 是否存在于这个集合中
srandmember 名字 抽取多少数据 :这个表示的是 从一个集合中 抽取多少个数据 数据不删除
spop 名字  抽取的数量 :从集合中取出指定个数的数据  而且数据还要删除
sinter 集合1  集合2 :求两个集合的交集
sinterstore 目的集合  集合1  集合2 :将集合1和集合2求交集 并且放到目的集合中
sunion 集合1  集合2  :求两个集合的并集
sunionstore 目的集合  集合1  集合2 :将集合1和集合2求并集集 并且放到目的集合中
sdiff 集合1   集合2 :在集合1中将集合2中拥有的元素给排除(求差集)将集合1中和集合2一样的元素给排除
scard 集合1 :计算当前集合中 拥有的元素的个数
1
2
3
4
5
6
7
8
9
10
11

假设我们要使用 set集合来进行存储

你们觉得要怎么设计才对?

sadd weixin:msg:用户id:消息id 关注的人的id

sadd weixinLmsg:101:77 100

scard weixinLmsg:101:7

研究下 如果要存储消息

hset weixin:msg:发送消息的人的id 消息的id: 评论的人的id 消息内容

场景

xx:关注了 xxSet = { liulei dashixing} liulei :关注了 liuleiSet = { xx dashixing yangjianhui hehanyu} yjh: 关注了 yjhSet = {dashixing xx liulei chengjunbo} dsx {liulei yjh xx}

问题来了: xx 和 yjh 共同关注的人 xx 关注的人 也关注了他( liulei ) xx 可能认识的人

# sorted set相关的命令

zadd 集合的名字 打分 key的名字  :表示的是向咋们的这个 集合中添加数据
zincrby 集合的名字  增加的分值  key的值 :给这个键 增加多少分
zrange 集合的名字  开始的区间(下标)  结束的区间(下标)
zrevrank 集合的名字 key的名字 
zscore 集合的名字  key的名字  :获取这个key的值(分值)
zcount 集合的名字   分值的开始区间   分值的结束区间    统计一个分值区间内的人数的个数
1
2
3
4
5
6

场景:

科普:最热商品(表示的是点击数最多 或者 购买数最多的这个商品 就是咋们的最热商品)

第一次卖出一个商品

zadd hotest:goods 10 商品的id

第二次 或者 第n次卖出这个商品 (这个表示的是每卖出一次增加10分的分值)

zincrby hotest:goods 10 商品的id

如果前端页面 要获取 这个罪人商品的前20条信息

zrange hotest:goods 0 20

直播间小姐姐的热度:

主播接受的不同的礼物的分值之和+直播时间的长短+直播间粉丝的活跃度+粉丝量的问题

现在小姐姐 需要查看自己的排名:

zrevrank 集合的名字 key的名字 :查询当前的key在集合中的排名

平台认为小时榜中 热度在20000-40000是全球最强打野主播 40000-60000是地表最强的打野主播

是不是就要用到统计

zcount 集合的名字 分值的开始区间 分值的结束区间 这个就可以统计在这个区间内的人数

主播不播了 主播不播了 ------ 那么这个主播的热度全部都需要清空

# 发布订阅模型

相关的命令(不会用 会用MQ等去代替他)

进入客户端,一个发送,一个接收

subscribe 频道的名字 订阅一个频道

publish 频道的名字 发送的消息 :向某一个频道发送一个消息

# 事务问题(不能保持原子性)

multi----开启事务
exec-----执行事务
1
2

# 实现计数器

  • 对于Redis的Key本身来说,有INCRBY指令,实现某个值的递增递减。

  • 比如以下场景:统计某个帖子的点赞数;存放某个话题的关注数;存放某个标签的粉丝数;存储一个大体的评论数;某个帖子热度;红点消息数;点赞、喜欢、收藏数等。

  • 像微博这样容易出现热点的业务,传统的数据库,肯定是撑不住的,就要借助于内存数据库。由于Redis的速度非常快,就不用再采用传统DB非常慢的count操作,所有这种递增操作都是毫秒级别的,而且效果都是实时的。
#redis
最近更新: 2025/07/30, 15:37:56
五种数据类型
持久化模式

← 五种数据类型 持久化模式→

最近更新
01
服务端配置
07-30
02
frp 安装
07-30
03
Prometheus采集Springboot应用
02-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | YeLu🤠MiLu🤪 | MIT License 蜀ICP备2024116879号 | 川公网安备51012202001998号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
欢迎你,我的朋友
看板娘