目 录CONTENT

文章目录

Redis基础

FatFish1
2025-06-07 / 0 评论 / 0 点赞 / 5 阅读 / 0 字 / 正在检测是否收录...

Redis简述

Redis的一些特性

  • Redis是一种基于键值对(key-value)的NoSQL数据库

  • Redis的存储数据结构有string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等

  • Redis是一种内存数据库,数据读写都在内存上,因此性能非常好

  • Redis是单线程串行化执行命令的,节省了线程切换开销,也有助于提升性能

  • Redis提供快照和日志功能,将数据持久化到硬盘上,用于故障恢复

  • Redis还提供一些键过期、发布订阅、事务、流水线Pipeline、Lua脚本等附加功能

  • Redis提供主从复制能力,使得Redis可以搭建主从架构、集群RedisCluster架构等

Redis的使用场景

常用于缓存、排行榜系统、计数器、社交点赞下拉刷新、消息队列等

安装Redis

普通linux环境可以使用wget安装

$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz
$ tar xzf redis-3.0.7.tar.gz
$ ln -s redis-3.0.7 redis
$ cd redis
$ make
$ make install

如果是docker环境就比较简单了,直接找下redis最新版本的镜像包,安装镜像包就可以了

Redis可执行文件

redis-server

启动Redis服务器

redis-cli

Redis命令行客户端

redis-benchmark

Redis基准测试工具

redis-check-aof

Redis AOF持久化文件检测和修复工具

redis-check-dump

Redis RDB持久化文件检测和修复工具

redis-sentinel

启动Redis Sentinel

redis-server

启动命令,可以带参或不带参执行:

$ redis-server
$ redis-server --configKey1 configValue1 --configKey2 configValue2
$ redis-server --port 6380
$ redis-server /opt/redis/redis.conf

redis-cli

客户端命令行

交互模式如下:

redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"

直接命令行不太常用:

redis-cli -h 127.0.0.1 -p 6379 get hello
"world"

可以通过客户端关闭redis服务器

$ redis-cli shutdown nosave|save
# nosave或save是指定是否生成持久化文件

Redis命令

全局命令

针对所有数据类型的键都可以用的就是全局命令

# 查看所有键
keys
keys *
# 查看键总数,复杂度O(1)
dbsize
# 查询键是否存在
exists key
# 删除键,支持多删除,返回值为删除的数量
del key1 [key2 key3...]
# 过期键,为key设置xx秒后过期
expire key seconds
# 按时间点过期(秒级)
expireat 1469980800  # 在2016-08-01 00:00:00过期
# 键在milliseconds毫秒后过期
pexpire key milliseconds
# 键在毫秒级时间戳timestamp后过期
pexpireat key milliseconds-timestamp
# 清除过期时间
persist key
# 查看剩余时间,返回值为-1即不过期,-2为不存在,如果大于0即其过期时间实际值
ttl key
# 查看键的数据类型
type key

键管理命令

# 重命名
rename key newkey
# 随机返回一个键
randomkey
# 在redis的不同db之间迁移键
move key db
# 现在不同的Redis实例之间进行数据迁移
dump key
restore key ttl value

数据库操作

# 切换数据库
select dbIndex
# 清除,flushdb只清除当前数据库,flushall会清除所有数据库
flushdb
flushall

注意:flush操作在键多的场景下可能会阻塞命令

Redis的单线程架构

所有经过客户端提交到redis-server的命令都会进入一个队列,串行执行,所以redis一定不会产生并发问题,及其适合用来加锁

但是如果一个命令执行时I/O较慢,会阻塞后面,这样性能就不高了

redis的解决方案是I/O多路复用技术,使用epoll作为实现,在epoll中将所有的连接、读写、关闭都转换为事件,避免在网络I/O上浪费过多时间

补链接图p74

redis使用单线程性能还非常高,这是因为redis是纯内存操作,加上I/O多路复用解决I/O性能瓶颈,同时单线程避免了线程切换和竞争的损耗,因此使得redis性能变快

因此redis开发过程中,性能瓶颈往往在网络,而不是redis本身

但是单线程同时产生了一个问题:执行的redis命令性能需要严格控制,如果单个命令性能差,后续所有命令就都会被阻塞了

0

评论区