Lazy loaded image
学习笔记
🦋1、Redis基本特性
字数 4058阅读时长 11 分钟
2024-5-1
2026-1-7
type
status
date
slug
summary
tags
category
icon
password

一、Redis的特性

  1. 速度快
  1. 持久化
  1. 多种数据结构
  1. 支持多种编程语言(客户端)
  1. 功能丰富
  1. 简单
  1. 主从复制
  1. 高可用、分布式

1. 速度快

官方数据是 10w OPS。为什么它会这么快?
  1. 数据存储:数据存储在内存中,内存的数据读写速度在 ns 级别,这是它速度快的本质原因。
  1. 语言实现:使用 C 语言实现,代码质量高,性能强悍。
  1. 线程模型:单线程实现,CPU不是当时Redis的性能瓶颈,并且多线程会产生线程切换、锁竞争等问题
 
notion image
 

2. 持久化

前面我们知道 Redis 数据存储在内存中,内存具有易失性,断电后数据会丢失。所以Redis提供持久化功能
Redis所有数据保持在内存中,对数据的更新将异步地保存到磁盘上。

3. 多种数据结构

Redis是键值型数据库,key只能是strings,但是value可以是多种数据结构(与它对应的是 memcached 只提供字符串类型的 value):
notion image
除了上述5种数据结构,Redis在新版本还提供了其衍生的数据结构:
  1. BitMaps: 位图 (布隆过滤器)
  1. HyperLogLog:超小内存唯一值计数 (允许误差)
  1. GEO:地理信息定位

4. 支持多种客户端语言

主流编程语言都支持

5. 功能丰富

  • 发布订阅:实现很多消息的功能
  • Lua脚本:自定义命令(Redis单线程执行)
  • 事务
  • pipeline:提高客户端并发效率

6. 简单

  • 核心模块:2.3w行代码(去除集群功能)
  • 不依赖外部库
  • 单线程

7. 主从复制

notion image

8. 高可用、分布式

高可用:Redis从2.8版本后提供 Redis-Sentinel功能实现其高可用
分布式:Redis从3.0版本后支持 Redis-Cluster功能支持分布式

二、Redis安装和部署

0. 安装前的准备工作

1. Redis安装

2. 可执行文件说明

如果编译成功,你将在 src 目录下找到几个 redis 二进制文件,包括:
  • redis-server: Redis服务器
  • redis-cli:Redis命令行客户端
  • redis-benchmark:性能测试功能
  • redis-check-aof:AOF修复工具
  • redis-check-rdb:RDB修复工具
  • redis-sentinel:setinel服务器

3. 启动

一般我们推荐配置文件启动。将 redis.conf 移到 /etc/目录下。修改必要的配置
  • 将 daemonize 属性值由 no 改为 yes,使 Redis 进程以守护进程方式运行。
  • port:Redis对外端口号
  • logfile:日志输出文件名
  • dir:Redis工作目录
  • bind,绑定客户端 IP,用于限定可以访问自己的客户端 IP。
  • requirepass:设置访问密码
可以使用 config get * 查看Redis所有配置
给redis-server配置systemd管理

三、API使用

1. 通用命令

  • keys
  • dbsize:查看数据库大小
  • exists key:判断一个key是否存在
  • del key [key...]:删除一个key,也可以删除多个
  • expire key seconds:给一个key设置过期时间
  • type key:查看其对应的数据类型
keys *
keys 命令一般不在生产环境使用,生产环境中key会非常多,keys是一个O(n)的操作,查询会非常慢,Redis是一个单线程模型,慢查询会阻塞后面的查询命令。
如何用 keys * 命令?
  • 热备从节点
  • scan
dbsize
dbsize可以在生产环境中使用,Redis内置了一个计数器记录数据库中插入的key个数
info memory
exits key
del key
key过期
expire、ttl、persist
type key

2. 数据结构和内部编码

notion image
Redis对外提供5种数据类型:string、hash、list、set、zset。每种数据类型内部又由多种数据结构实现。
RedisObject:
  • 数据类型(type):标识对外提供的数据类型,string、hash、list、set、sorted set
  • 编码方式(encoding):raw、int、ziplist、linkedlist、hashmap、intset
  • 虚拟内存(vm)
  • 其他信息

3. 字符串类型

value最大限制 512MB
一般建议 key-value对在 100k以内
使用场景:
  • 缓存
  • 计数器
  • 分布式
字符串键值结构:
key:value
get
set
del
incr
decr
incrby
decrby
实战1:
记录网站每个用户个人主页的访问量
实战2:
缓存视频的基本信息(数据源在MySQL中)
实战3:
实现一个分布式ID生成器,多实例并发去Redis中获取自增的ID
set
setnx
set xx
mget
mset
批量操作可以减少网络时间
getset
append
strlen
incrbyfloat
getrange
setrange

4. 哈希类型

哈希键值结构:
notion image
你可以把它看成关系型数据库中的一张表
notion image
特点:
  • Mapmap
  • field不能相同,value可以相同
hget
hset
hdel
hgetall
hgetall会返回对应key所有的field和value,如果这个哈希结构非常大,会是一个非常耗时的操作;而且大部分情况你并不需要取出所有的field和value,所以尽可能使用hmget
hexists
hlen
hmget
hmset
实战1:
记录网站每个用户个人主页的访问量
实战2:
缓存视频基本信息(数据源在MySQL中)——使用哈希结构
hvals
hkeys
string vs. hash
notion image
 
实战3:
缓存用户信息
  1. 使用string实现,将信息缓存成json格式的字符串
  1. 使用string实现,使用很多个key实现,比如 user:1:name、user:1:age
  1. 使用hash实现,将用户的每个属性作为field
hsetnx
hincrby
hincrbyfloat

5. 列表类型

列表键值类型
key-value对,value是一个双端队列,可以从左边插入和删除,也可以从右边插入和删除
特点:
  • 有序
  • 可以重复
  • 可以从左右弹出
rpush
lpush
linsert
lpop
rpop
lrem
ltrim
lrange
lindex
llen
lset
blpop
brpop
TIPS:
  • lpush + lpop = stack
  • lpush + rpop = queue
  • lpush + ltrim = Capped Collection(固定数量列表)
  • lpush + brpop = Message Queue

6. 集合类型

特点:
  • 无序
  • 无重复
  • 集合间操作
sadd
srem
scard
sismember
srandmember
不会破坏数据,可以随机返回多个元素
spop
随机弹出元素,会破坏数据
smembers
无序小心使用,smembers 是一个O(n)的操作
实战1:
抽奖系统
spop
实战2:
标签(tag)
可以给用户添加标签
sdiff
sinter
sunion
sdiff|sinter|sunion + store destkey
实战3:
共同关注
TIPS:
  • sadd 可以做一些标签
  • spop、srandmember 可以做随机数
  • sadd、sinter 做一些社交图

7. 有序集合类型

有序集合键值:
notion image
值由两部分组成:score 和 value
特点:
  • 无重复元素
  • 有序(按照score排列)
  • 值由element+score组成
zadd
时间复杂度:O(logN)
zrem
zscore
zincrby
zcard
zrank
zrange
zrangebyscore
zcount
zremrangebyrank
zremrangebyscore
实战1:
排行榜
score: timeStamp、saleCount、followCount
zrevrank
zrevrange
zrevrangebyscore
zinterstore
zunionstore
小结:
notion image
上一篇
2、Redis其他功能
下一篇
2、Redis其他功能