一、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 内存数据库;

  1. 到底是要运行速度快,还是要存储效率高;
  2. 数据量少的时候,存储效率高为主;
  3. 数据量多的时候,运行速度快;

五、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相关命令及应用场景详解相关推荐

  1. Redis相关命令及使用场景介绍

    1. Redis相关命令及使用 1.1 string 格式:(key:value) SET key value 添加一个key value 值(set 键 值) 127.0.0.1:6379> ...

  2. Redis五种数据类型应用场景详解(超级详细版)

    目录 NoSQL:一类新出现的数据库(not only sql) 特征 NoSQL和SQL数据库的比较: 电商场景解决方案 Redis简介 Redis特性 Redis 优势 Redis应用场景 官方文 ...

  3. PHP连接redis并执行redis相关命令的方法详解

    PHP连接redis并执行redis相关命令的方法详解 连接redis库的方法 共性的运算归类 redis服务类函数 set 操作增删改查 List栈的结构,注意表头表尾,创建更新分开操作 Set,没 ...

  4. Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解

    文章目录 Redis(十)--HyperLogLog 基数统计和 Bitmap位图场景详解 1.HyperLogLog 基数统计 2.Bitmap位图场景详解 Redis(十)--HyperLogLo ...

  5. redis cluster管理工具redis-trib.rb详解

    redis cluster管理工具redis-trib.rb详解 redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集 ...

  6. Redis系列教程(七):Redis并发竞争key的解决方案详解

    Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题: 高并发架构系列:Redis缓存和MySQL数据一致性方案详解 如何解决Redis缓 ...

  7. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  8. 高并发架构系列:Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  9. Redis五种基本数据类型底层详解(原理篇)

    Redis五种基本数据类型底层详解 详细介绍Redis用到的数据结构 简单动态字符串 SDS和C字符串的区别 总结 链表 字典 哈希表 字典 哈希算法 解决键冲突 rehash(重点) 渐进式reha ...

最新文章

  1. Apache Tomcat 7.0.93 发布,开源 Java Web 应用服务器
  2. MapReduce源代码浅析
  3. 【算法】图的基本介绍 以及 存储方式
  4. 0bug到底碰痛了谁的神经?
  5. cocos2d(粒子效果编辑器)
  6. FLEX自动完成组件.--AutoSuggest
  7. 工程之星位置服务器,工程之星5.0中求坐标转换参数需要谨记这七大点!
  8. 2019年全国大学生电子设计竞赛试题 简易电路特性测试仪(D) 题 设计报告
  9. B站视频下载助手使用教程
  10. Index.ANALYZED in lucene4 is deprecated
  11. NXP KV10 FTM fault功能的配置
  12. 求最大公约数c语言实验心得,C语言编程实训报告(合集)
  13. 高通平台耳机类型识别
  14. java String的intern()方法
  15. 【software】常见流氓软件
  16. xml 入门 shema_01
  17. excel填充遇到的坑
  18. C# 关键字 使用where来限定泛型约束
  19. iOS 保持界面流畅的技巧,满满都是收获。
  20. 2008ESRI用户大会问答之ArcGIS部分

热门文章

  1. 失业的程序员(三):口才帝和表情帝
  2. GitHub SSH免密登录
  3. 微信小程序开发 — Flex布局
  4. 从全职高手开始的系统_从全职高手开始的无敌
  5. Mysql 唯一索引的字段值 允许多个NULL值存在吗
  6. c语言指针的强制类型转换,c语言指针的强制转换
  7. IntelliJ IDEA断点调试如何查看源码
  8. 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出本月有几天
  9. 计算机基础知识win10,计算机应用基础Windows XP及win10试题
  10. 跟随B站视频学Python爬虫过程(6):豆瓣电影TOP250并存Excel(使用urllib, bs, re, xlwt库)