文章目录
- 1.Redis概述&安装配置
- 安装
- 启动
- 2.Redis的Key的设计规范
- 1、key名设计
- 2、避免bigkey
- **string字符串类型**
- hash类型(散列表)
- list列表类型
- set集合类型
- sortedset有序集合类型
- bitmap位图 类型
- geo地理位置类型
1.Redis概述&安装配置
官网:https://redis.io
中文官网地址:http://www.redis.cn
简单来说Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是Redis 的数据是存在内存中的,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。
另外,Redis 除了做缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。
Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务、持久化、Lua 脚本、多种集群方案。
Redis应用场景
- 缓存使用,减轻DB压力
- DB使用,用于临时存储数据(字典表,购买记录)解决分布式场景下Session分离问题(登录信息)任务队列(秒杀、抢红包等等)乐观锁
- 应用排行榜 zset
- 签到 bitmap
- 分布式锁
- 冷热数据交换
安装
第一步:安装 C 语言需要的 GCC 环境
yuminstall-ygcc-c++
yuminstall-ywget
第二步:下载并解压缩 Redis 源码压缩包
#下载
wgethttps://download.redis.io/releases/redis-6.2.4.tar.gz
mkdir/usr/local/redis
tar-zxvfredis-6.2.4.tar.gz-C/usr/local/redis
第三步:编译 Redis 源码,进入 redis-6.2.4 目录,执行编译命令,进行安装
cd /usr/local/redis/redis-6.2.4/src
make && make instalL
执行完毕后安装成功!
启动
前端启动
- 启动命令: redis-server ,直接运行 bin/redis-server 将以前端模式启动
- 关闭命令: ctrl+c
- 启动缺点:客户端窗口关闭则 redis-server 程序结束,不推荐使用此方法
2.Redis的Key的设计规范
1、key名设计
可读性和可管理性
以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如 业务名:表名:id
简洁性
保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视:
不要包含特殊字符
反例:包含空格、换行、单双引号以及其他转义字符
2、避免bigkey
- 情况一:键值对的值大小本身就很大,例如value为1MB的String数据类型。为了避免String类型的
bigKey,在业务层,我们要尽量把String类型的大小控制在10KB以下。 - 情况二:键值对的值是集合类型,集合元素个数非常多,例如包含100万个元素的Hash集合类型数
据。为了避免集合类型的bigkey,对应的设计规范是,尽量把集合类型的元素个数控制在1万以
下。
string字符串类型
- 介绍 :string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的,但是 Redis 并没
有使用 C 的字符串表示,而是自己构建了一种 简单动态字符串(simple dynamic string,
SDS)。相比于 C 的原生字符串,Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据,并
且获取字符串长度复杂度为 O(1)(C 字符串为 O(N)),除此之外,Redis 的 SDS API 是安全的,不会
造成缓冲区溢出。 - 常用命令: set,get,strlen,exists,decr,incr,setex 等等。
- 应用场景 :一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。
-
单值缓存
SET key value
GET key -
对象缓存
MSET user:1:name zimu user:1:balance 1888
MGET user:1:name user:1:balance -
分布式锁(「SET if Not eXists」)
SETNX product:10001 true // 返回1代表获取锁成功
SETNX product:10001 false // 返回0代表获取锁失败
…执行业务操作
DEL product:10001 // 执行完业务 释放锁
SET product:10001 true ex 10 nx // 防止程序意外终止导致死锁 -
计数器
INCR article:readcount:101
hash类型(散列表)
- 介绍 :hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组 + 链表)。不过,Redis 的
hash 做了更多优化。另外,hash 是一个 string 类型的 field 和 value 的映射表,特别适合用于存
储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以 hash
数据结构来存储用户信息,商品信息等等。 - 常用命令: hset,hmset,hexists,hget,hgetall,hkeys,hvals 等。
- 应用场景: 系统中对象数据的存储。
- 对象缓存
HMSET user {userId}:username zhangfei {userId}:password 123456
HMSET user 1:username zhangfei 1:password 123456
HMGET user 1:username 1:password
优点:
1)同类数据归类整合储存,方便数据管理
2)相比String操作消耗内存和cpu更小
3)相比String
缺点:
1)过期功能不能使用在field上,只能用在key上
2)Redis集群架构下不适合大规模使用
list列表类型
- 介绍 :list 即是 链表。链表是一种非常常见的数据结构,特点是易于数据元素的插入和删除并且
且可以灵活调整链表长度,但是链表的随机访问困难。许多高级编程语言都内置了链表的实现比如
Java 中的 LinkedList,但是 C 语言并没有实现链表,所以 Redis 实现了自己的链表数据结构。
Redis 的 list 的实现为一个 双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分
额外的内存开销。 - 常用命令: rpush,lpop,lpush,rpop,lrange、llen 等。
- 应用场景: 发布与订阅或者说消息队列、慢查询。
- 常用数据结构
Stack(栈)= LPUSH(左边放) + LPOP(左边取) --> FILO
Quece(队列)= LPUSH(左边放) + RPOP右边取)
BLocking MQ(阻塞队列)= LPUSH(左边放) + BRPOP(右边阻塞取:没有数据就阻塞!)
set集合类型
- 介绍 : set 类似于 Java 中的 HashSet 。Redis 中的 set 类型是一种无序集合,集合中的元素没有
先后顺序。当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且
set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。可以基
于 set 轻易实现交集、并集、差集的操作。比如:你可以将一个用户所有的关注人存在一个集合
中,将其所有粉丝存在一个集合。Redis 可以非常方便的实现如共同关注、共同粉丝、共同喜好等
功能。这个过程也就是求交集的过程。 - 常用命令: sadd,spop,smembers,sismember,scard,sinterstore,sunion 等。
- 应用场景: 需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景
sortedset有序集合类型
- 介绍: 和 set 相比,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行
有序排列,还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap 和 TreeSet
的结合体。 - 常用命令: zadd,zcard,zscore,zrange,zrevrange,zrem 等。
- 应用场景: 需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播
间在线用户列表,各种礼物排行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。
bitmap位图 类型
- 介绍 : bitmap 存储的是连续的二进制数字(0 和 1),通过 bitmap, 只需要一个 bit 位来表示某
个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以
bitmap 本身会极大的节省储存空间。 - 常用命令: setbit 、 getbit 、 bitcount 、 bitop
- 应用场景: 适合需要保存状态信息(比如是否签到、是否登录…)并需要进一步对这些信息进行分
析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)
geo地理位置类型
概述
Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。该类型,就是元素的2维
坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬
度Hash等常见操作
应用场景:附近的人、摇一摇、附近的车、附近银行站点查询
环境要求
- redis版本需要3.2及以上
- 如果使用jedis操作redis,需要jedis版本为2.9及以上
- 如果使用spring data redis操作redis,需要spring data redis版本为1.8.0及以上