type
status
date
slug
summary
tags
category
icon
password
一、Redis的特性
- 速度快
- 持久化
- 多种数据结构
- 支持多种编程语言(客户端)
- 功能丰富
- 简单
- 主从复制
- 高可用、分布式
1. 速度快
官方数据是 10w OPS。为什么它会这么快?
- 数据存储:数据存储在内存中,内存的数据读写速度在 ns 级别,这是它速度快的本质原因。
- 语言实现:使用 C 语言实现,代码质量高,性能强悍。
- 线程模型:单线程实现,CPU不是当时Redis的性能瓶颈,并且多线程会产生线程切换、锁竞争等问题

2. 持久化
前面我们知道 Redis 数据存储在内存中,内存具有易失性,断电后数据会丢失。所以Redis提供持久化功能
Redis所有数据保持在内存中,对数据的更新将异步地保存到磁盘上。
3. 多种数据结构
Redis是键值型数据库,key只能是strings,但是value可以是多种数据结构(与它对应的是 memcached 只提供字符串类型的 value):

除了上述5种数据结构,Redis在新版本还提供了其衍生的数据结构:
- BitMaps: 位图 (布隆过滤器)
- HyperLogLog:超小内存唯一值计数 (允许误差)
- GEO:地理信息定位
4. 支持多种客户端语言
主流编程语言都支持
5. 功能丰富
- 发布订阅:实现很多消息的功能
- Lua脚本:自定义命令(Redis单线程执行)
- 事务
- pipeline:提高客户端并发效率
6. 简单
- 核心模块:2.3w行代码(去除集群功能)
- 不依赖外部库
- 单线程
7. 主从复制

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. 数据结构和内部编码

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. 哈希类型
哈希键值结构:

你可以把它看成关系型数据库中的一张表

特点:
- 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

实战3:
缓存用户信息
- 使用string实现,将信息缓存成json格式的字符串
- 使用string实现,使用很多个key实现,比如 user:1:name、user:1:age
- 使用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. 有序集合类型
有序集合键值:

值由两部分组成: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
小结:

- 作者:Venture
- 链接:https://jintao123.top//article/redis_1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。


