redis
redis特性
- 速度快,10w ops(秒读写)数据都是内存操作,c语言实现。
- 单线程模型,所有的读写是同步的,不会出现脏读脏写
- 持久化:rdb和aof策略
- 多种数据结构:5大数据结构
- 支持多种编程语言:基于tcp通信协议,各大编程语言都支持通信
- 功能丰富:发布订阅(消息) Lua脚本,事务(pipeline)
- 操作简单:不依赖外部库,自身功能足够强大
- 主从复制:主服务器和从服务器,主服务器可以同步到从服务器中
- 支持高可用和分布式
linux安装部署
# 1 下载(源代码,c)
wget http://download.redis.io/releases/redis-6.2.9.tar.gz
#2 解压
tar -xzf redis-6.2.9.tar.gz
#3 建立软连接
ln -s redis-6.2.9 redis
cd redis
make&&make install
#4 在src目录下可以看到
#redis-server--->redis服务器
#redis-cli---》redis命令行客户端
#redis-benchmark---》redis性能测试工具
#redis-check-aof--->aof文件修复工具
#redis-check-rdb---》rdb文件检查工具
#redis-sentinel---》sentinel服务器,哨兵
#redis作者对windows维护不好,window自己有安装包
# ####卸载redis
# 1、查看redis进程;
ps aux|grep redis
# 2、kill掉进程;
kill 进程id
# 3、进入到redis目录
cd /usr/local/
# 4、删除redis对应的文件
rm -f /usr/local/redis/bin/redis*
rm -f /usr/local/bin/redis*
# 5、删除对应的文件
rm -rf redis
现在也支持通过yum命令一键下载部署的方式。
redis-server启动
3.1 最简启动
#最简启动
redis-server
ps -ef|grep redis #查看进程
#yum install net-tools -y
netstat -antpl|grep redis #查看端口
redis-cli -h ip -p port ping #命令查看
3.2 动态参数启动
#动态参数启动
redis-serve --port 6380 #启动,监听6380端口
3.3 配置文件启动
# 默认配置文件:是redis文件夹下的redis.conf
# 自定义配置文件启动
#####通过redis-cli连接,输入config get * 可以获得默认配置
#自己手创一个myredis.conf文件
#daemonize--》是否是守护进程启动(no|yes)
#port---》端口号
#logfile--》redis系统日志
#dir--》redis工作目录
daemonize yes
pidfile /var/run/redis.pid
port 6379
dir "/root/redis/data"
logfile 6379.log
# 创建data文件夹
mkdir data # 按照上面的路径创建一个存data的工作目录
# 启动
redis-server myredis.conf
客户端连接命令
redis-cli -h 地址 -p 端口
redis-cli -h 127.0.0.1 -p 6379
redis-cli -h 127.0.0.1 -p 6379 info # info是redis交互的一个命令,但是如果直接在客户端连接后跟交互命令,那么不进入交互环境,直接拿到结果
CONFIG GET * # 获取redis的配置信息
# 只需要关注 dir,port,daemonize等
# requirepass 设置的密码是什么,如果是空,没有密码
# 直接修改redis的配置信息,修改后同步到硬盘,永久生效
CONFIG SET requirepass 123456 # 设置密码配置
CONFIG REWRITE # 将改动的配置写到硬盘上了
# 当redis设置密码后,必须使用如下两种方式验证才能进行其他命令操作
-方式一:直接连接,指定密码:redis-cli -a 123456
-方式二:先连接进去redis-cli,再执行r auth 密码
# redis配置文件:
# bind 127.0.0.1 0.0.0.0
# port 端口
# requirepass 密码
# dir 工作目录
# logfile 日志文件
# daemonize 是否以守护进程运行
# pidfile 放的是进程id号
# maxmemory 可以使用的最大内存
# databases 有多少个库
# dbfilename rdb的持久化方案的存储文件dump.rdb
redis典型场景
- 缓存系统:使用最广泛的就是缓存
- 计数器:网站访问量,转发量,评论数(因为是单线程模型,所以不会出现并发安全问题)
- 消息队列:发布订阅,阻塞队列实现(简单的分布式,blpop:阻塞队列,生产者消费者) -- celery的消息队列就可以用到
- 社交网络:很多特效跟社交网络匹配,粉丝数,关注数,简单的推荐
- 实时系统:垃圾邮件处理系统,黑白名单系统
- 地理位置信息:附近的人
redis通用命令
打印key
打印所有的key
keys *
打印出以he开头的key
keys he*
打印出所有以he开头,第三个字母是h到l的字母的key值
keys he[h-l]
实际上keys后的表达式和正则表达式很像,就是匹配所有符合表达式的key
keys指令不要在生产环境下执行,因为redis就这一个线程,被这个命令占据的话会很影响业务
计算key的总数
redis内置了计数器,所以相当于直接把key的总数查出来了
dbsize
值操作
查看值
get key
设置值
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
查看key是否存在
exists key
(integer) 1
# 存在返回1 不存在返回0
删除值
del key
(integer) 1
# 删除成功返回1 不存在返回0
设置值的过期时间
expire key seconds
expire name 3 # name3s后过期
ttl name # 查看name还有多长时间过期
persist name # 去掉name的过期时间
查看key值的类型
type name
其他命令
info命令:内存,cpu,主从相关
client list 正在连接的会话
client kill ip:端口
dbsize 总共有多少个key
flushall 清空所有
flushdb 只清空当前库
select 数字 选择某个库 总共16个库
monitor 记录操作日志,停止交互,只显示输出日志,能看到操作地址、操作内容等
内部编码和redis架构
数据结构和内部编码
五大数据类型还可以继续细分不同的内置编码
单线程架构
单线程架构,
一个瞬间只会执行一条命令,所有的命令任务都是排着队的
单线程为什么这么快
是指单线程下为什么并发还挺高
- 纯内存操作
- 非阻塞IO (epoll),自身实现了事件处理,不在网络io上浪费过多时间
- 避免线程间切换和竞态消耗
注意
-
1 一次只运行一条命令
-
2 拒绝长慢命令
-keys,flushall,flushdb,慢的lua脚本,mutil/exec,operate,big value
-
3 其实不完全是单线程,但是数据操作部分就是单线程的(在做持久化是另外的线程)
-fysnc file descriptor
-close file descriptor