redis在linux的操作

发布时间 2023-04-17 16:29:15作者: leethon

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架构

数据结构和内部编码

五大数据类型还可以继续细分不同的内置编码

image

单线程架构

单线程架构,

一个瞬间只会执行一条命令,所有的命令任务都是排着队的

单线程为什么这么快

是指单线程下为什么并发还挺高

  1. 纯内存操作
  2. 非阻塞IO (epoll),自身实现了事件处理,不在网络io上浪费过多时间
  3. 避免线程间切换和竞态消耗

注意

  • 1 一次只运行一条命令

  • 2 拒绝长慢命令

    -keys,flushall,flushdb,慢的lua脚本,mutil/exec,operate,big value

  • 3 其实不完全是单线程,但是数据操作部分就是单线程的(在做持久化是另外的线程)

    -fysnc file descriptor

    -close file descriptor