Redis相关命令及应用场景详解
一、Redis是什么
Redis是远程字典服务Remote Dictionary Service的简称。Redis 是内存数据库,KV 数据库,V支持多种数据结构,如:string、list、hash、set、zset等。
。
二、Redis编译安装和启动
2.1 编译安装
git clone https://gitee.com/mirrors/redis.git -b
6.2
cd redis
make
make test
make install
# 默认安装在 /usr/local/bin
# redis-server 是服务端程序
# redis-cli 是客户端程序
2.2 启动
mkdir redis-data
# 把redis文件夹下 redis.conf 拷贝到 redis-data
# 修改 redis.conf
# requirepass 修改密码 123456
# daemonize yes
cd redis-data
redis-server redis.conf
# 通过 redis-cli 访问 redis-server
redis-cli -h 127.0.0.1 -a 123456
三、核心点
Redis是请求回应模式,也就是redis客户端发送命令请求,redis-sever给相应的回复。命令的返回值很重要。我们需要根据不同的返回值,处理自己的业务逻辑。
四、Redis中的编码
redis 内存数据库;
- 到底是要运行速度快,还是要存储效率高;
- 数据量少的时候,存储效率高为主;
- 数据量多的时候,运行速度快;
五、Redis K-V中的Value类型分析
5.1 String字符串
Redis的string是二进制安全字符串,还可以存储图片等二进制数据。string扩容原理:字符串小于1M时,加倍扩容超过1M每次增加1M;字符串的最大长度为512M。支持bit操作。
5.1.1 基本命令
SET key val #设置 key 的 value 值
GET key # 获取 key 的 valueINCR/DECR key # 执行原子加一/减一的操作
INCRBY/DECRBY key increment # 执行原子加一个/减一个整数的操作SETNX key value #如果key不存在,则设置 该kv,如果存在则执行失败
DEL key # 删除 key val 键值对SETBIT key offset value # 设置字符串offset位置的为calue
GETBIT key offset # 统计字符串offset位置的值
BITCOUNT key # 统计字符串被设置为1的bit数.
5.1.2 应用
对象存储
可以存储那些,极少修改的对象。比如可以将用户的部分属性数据,保存为json格式。如果要修改某个属性,需要get key得到json串,再进行反序列化,得到结构体,再修改该属性,再序列化为json格式,set key val进行保存。可以看到比较麻烦,如果要经常修改某个属性,string就不适合存储了,可以使用hash进行存储。
累加器
比如博客的阅读量统计
分布式锁
分布式锁具体可以参考我之前的文章分布式锁原理及实现
位运算
比如可以用来统计用户某个月的签到情况。分析:该用户2022年10月第一天、第二天签到,第三天缺勤,第四天签到。 bitcount 得到该用户10月签到3次。getbit获取该用户某一天的签到情况。
5.2 List
链表中数据压缩条件:
- 元素长度大于等于48
- 元素压缩后长度差超过8
List是双向链表,元素前后插入时间复杂度是O(1),查找某个元素时间复杂度是O(n)。
5.2.1 基本命令
LPUSH key value [value ...] # 从队列的左侧入队一个或多个元素
LPOP key # 从队列的左侧弹出一个元素RPUSH key value [value ...] # 从队列的右侧入队一个或多个元素
RPOP key # 从队列的右侧弹出一个元素LRANGE key start end # 返回从队列的 start 和 end 之间的元素 0, 1 2 负索引# list 没有去重功能
LREM key count value # 从存于 key 的列表里移除前 count 次出现的值为 value 的元素# RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接,应用:超时时间 + 延时队列
BRPOP key timeout
5.2.1 应用
栈、队列
栈:LPUSH + LPOP 或者 RPUSH +RPOP
队列:LPUSH + RPOP 或者 RPUSH + LPOP
阻塞队列
LPUSH + BRPOP 或者 RPUSH + BLPOP
BRPOP key timeout 其中,timeout为0,表示永久阻塞。
阻塞连接。BRPOP,如果数据没准备好会阻塞,直到别的客户端有数据写入。客户端A使用BRPOP阻塞等待获取teacher队列中的消息,当客户端A生产消息后,客户端A就能收到消息。
异步消息队列
与队列操作一样,只是在不同系统之间。
5.2.4 获取固定窗口记录(战绩)
比如,假设LOL游戏助手只保存你的最近50场对局记录,查找当前50条战绩,这些记录需要按照时间顺序返回。
lpush rank '{"user":"panda","hero":"卡莎","result":"win","honor":"mvp","timestamp":"2022-10-22 12:00:00"}'
lpush rank '{"user":"panda","hero":"卡莎","result":"win","honor":"mvp","timestamp":"2022-10-22 11:00:00"}'
lpush rank '{"user":"panda","hero":"麦林炮手","result":"win","honor":"mvp","timestamp":"2022-10-22 10:00:00"}'
lpush rank '{"user":"panda","hero":"霞","result":"win","honor":"","timestamp":"2022-10-22 09:00:00"}'
lpush rank '{"user":"panda","hero":"霞","result":"win","honor":"mvp","timestamp":"2022-10-22 08:00:00"}'
lpush rank '{"user":"panda","hero":"泰隆","result":"win","honor":"mvp","timestamp":"2022-10-22 07:00:00"}'
lpush rank '{"user":"panda","hero":"卡萨丁","result":"win","honor":"mvp","timestamp":"2022-10-22 06:00:00"}'ltrim 0 49 裁剪最近50条战绩记录
lrange 0 -1
实际项目中需要保证命令的原子性,一般用Lua脚本。
-- redis lua脚本
local record = KEYS[1]
redis.call("LPUSH", "rank", record)
redis.call("LTRIM", "rank", 0, 49)
5.3 Hash
5.3.1 基本命令
HSET key field value # 设置 key 对应 hash 中的 field 对应的值
HGET key field # 获取 key 对应 hash 中的 field 对应的值HMSET key field1 value1 field2 value2 ... fieldn valuen # 设置多个hash键值对
HMGET key field1 field2 ... fieldn # 获取多个field的值HINCRBY key field increment # 给 key 对应 hash 中的 field 对应的值加一个整数值
HLEN key # 获取 key 对应的 hash 有多少个键值对HDEL key field # 删除 key 对应的 hash 的键值对,该键为field
5.3.2 应用
存储对象
hash可以优雅的修改hash:10001对象指定属性的值。如果是前面提到的string就比较复杂了。注意:hash的value只能是string类型。
5.4 Set
set集合用来存储唯一性字段,不要求有序。
5.4.1 基础命令
SADD key member [member ...] # 添加一个或多个指定的member元素到集合的 key中
SCARD key # 计算集合元素个数SMEMBERS key # SMEMBERS key
SISMEMBER key member # 返回成员 member 是否是存储的集合 key的成员SRANDMEMBER key [count] # 随机返回key集合中的一个或者多个元素,注意并不删除这些元素
SPOP key [count] # 从存储在key的集合中移除并返回一个或多个随机元素SDIFF key [key ...] # 返回一个集合与给定集合的差集的元素
SINTER key [key ...] # 返回指定所有的集合的成员的交集
SUNION key [key ...] # 返回给定的多个集合的并集中的所有成员
5.4.2 应用举例
抽奖
SADD 设置一等奖抽奖用户;SRANDMEMBER 随机抽取一等奖一名
共同关注
假设用户A的粉丝有:mark darren king
假设用户B的粉丝有:mark darren panda
则:A 和 B 的共同粉丝:darren king
推荐好友
假设用户A的粉丝有:mark darren king otto
假设用户B的粉丝有:mark darren king
则:C可能认识的人:otto
5.5 ZSET
zset是一个有序集合,典型应用就是实现排行榜功能。
5.5.1 基础命令
# 添加到键为key有序集合里
ZADD key [NX|XX] [CH] [INCR] score member [score member ...] ZREM key member [member ...] # 从键为key有序集合中删除 member 的键值对
# 返回有序集key中,成员member的score值
ZSCORE key member
# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
# 返回key的有序集元素个数
ZCARD key
# 返回有序集key中成员member的排名
ZRANK key member
# 返回存储在有序集合key中的指定范围的元素 order by id
limit 1,100
ZRANGE key start stop [WITHSCORES]
# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]
5.5.2 应用举例
Redis 命令详解官方地址:http://redis.cn/commands.html
文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:
Redis相关命令及应用场景详解相关推荐
- Redis相关命令及使用场景介绍
1. Redis相关命令及使用 1.1 string 格式:(key:value) SET key value 添加一个key value 值(set 键 值) 127.0.0.1:6379> ...
- Redis五种数据类型应用场景详解(超级详细版)
目录 NoSQL:一类新出现的数据库(not only sql) 特征 NoSQL和SQL数据库的比较: 电商场景解决方案 Redis简介 Redis特性 Redis 优势 Redis应用场景 官方文 ...
- PHP连接redis并执行redis相关命令的方法详解
PHP连接redis并执行redis相关命令的方法详解 连接redis库的方法 共性的运算归类 redis服务类函数 set 操作增删改查 List栈的结构,注意表头表尾,创建更新分开操作 Set,没 ...
- Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解
文章目录 Redis(十)--HyperLogLog 基数统计和 Bitmap位图场景详解 1.HyperLogLog 基数统计 2.Bitmap位图场景详解 Redis(十)--HyperLogLo ...
- redis cluster管理工具redis-trib.rb详解
redis cluster管理工具redis-trib.rb详解 redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集 ...
- Redis系列教程(七):Redis并发竞争key的解决方案详解
Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题: 高并发架构系列:Redis缓存和MySQL数据一致性方案详解 如何解决Redis缓 ...
- Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解
需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...
- 高并发架构系列:Redis缓存和MySQL数据一致性方案详解
需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...
- Redis五种基本数据类型底层详解(原理篇)
Redis五种基本数据类型底层详解 详细介绍Redis用到的数据结构 简单动态字符串 SDS和C字符串的区别 总结 链表 字典 哈希表 字典 哈希算法 解决键冲突 rehash(重点) 渐进式reha ...
最新文章
- Apache Tomcat 7.0.93 发布,开源 Java Web 应用服务器
- MapReduce源代码浅析
- 【算法】图的基本介绍 以及 存储方式
- 0bug到底碰痛了谁的神经?
- cocos2d(粒子效果编辑器)
- FLEX自动完成组件.--AutoSuggest
- 工程之星位置服务器,工程之星5.0中求坐标转换参数需要谨记这七大点!
- 2019年全国大学生电子设计竞赛试题 简易电路特性测试仪(D) 题 设计报告
- B站视频下载助手使用教程
- Index.ANALYZED in lucene4 is deprecated
- NXP KV10 FTM fault功能的配置
- 求最大公约数c语言实验心得,C语言编程实训报告(合集)
- 高通平台耳机类型识别
- java String的intern()方法
- 【software】常见流氓软件
- xml 入门 shema_01
- excel填充遇到的坑
- C# 关键字 使用where来限定泛型约束
- iOS 保持界面流畅的技巧,满满都是收获。
- 2008ESRI用户大会问答之ArcGIS部分
热门文章
- 失业的程序员(三):口才帝和表情帝
- GitHub SSH免密登录
- 微信小程序开发 — Flex布局
- 从全职高手开始的系统_从全职高手开始的无敌
- Mysql 唯一索引的字段值 允许多个NULL值存在吗
- c语言指针的强制类型转换,c语言指针的强制转换
- IntelliJ IDEA断点调试如何查看源码
- 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出本月有几天
- 计算机基础知识win10,计算机应用基础Windows XP及win10试题
- 跟随B站视频学Python爬虫过程(6):豆瓣电影TOP250并存Excel(使用urllib, bs, re, xlwt库)