一,概述
1.redis
redis是一种基于键值对(key-value)数据库,其中value可以为string、hash、list、set、zset等多种数据结构,可以满足很多应用场景。还提供了键过期,发布订阅,事务,流水线,等附加功能,
流水线: Redis 的流水线功能允许客户端一次将多个命令请求发送给服务器, 并将被执行的多个命令请求的结果在一个命令回复中全部返回给客户端, 使用这个功能可以有效地减少客户端在执行多个命令时需要与服务器进行通信的次数。
2. redis特性
1〉速度快,数据放在内存中,官方给出的读写性能10万/S,与机器性能也有关
a,数据放内存中是速度快的主要原因
b,C语言实现,与操作系统距离近
c,使用了单线程架构,预防多线程可能产生的竞争问题
2〉键值对的数据结构服务器
3〉丰富的功能:见上功能
4〉简单稳定:单线程
5〉持久化:发生断电或机器故障,数据可能会丢失,持久化到硬盘
6〉主从复制:实现多个相同数据的redis副本
8〉高可用和分布式:哨兵机制实现高可用,保证redis节点故障发现和自动转移
9〉客户端语言多:java php python c c++ nodejs等
3. 使用场景
a,缓存:合理使用缓存加快数据访问速度,降低后端数据源压力
b,排行榜:按照热度排名,按照发布时间排行,主要用到列表和有序集合
c,计数器应用:视频网站播放数,网站浏览数,使用redis计数
d,社交网络:赞、踩、粉丝、下拉刷新
e,消息队列:发布和订阅
4. 安装
a、下载源码,解压缩后编译源码。
$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz
$ tar xzf redis-4.0.6.tar.gz
$ cd redis-4.0.6
$ make
b、编译完成后,在Src目录下,有可执行文件redis-server、redis-benchmark、redis-cli和redis.conf配置文件。然后拷贝到一个目录下,目的时方便管理。
可执行文件 | 作用 |
redis-server | 启动redis |
redis-cli | redis命令行客户端 |
redis-benchmark | 基准测试工具 |
redis-check-aof | AOF持久化文件检测和修复工具 |
redis-check-dump | RDB持久化文件检测和修复工具 |
redis-sentinel | 启动哨兵 |
mkdir /usr/local/redis
cp redis-server /usr/local/redis
cp redis-benchmark /usr/local/redis
cp redis-check-rdb /usr/local/redis
cp redis-sentinel /usr/local/redis
cp redis-cli /usr/local/redis
返回上一级(redis-4.0.6根目录)拷贝redis的配置文件
cp redis.conf /usr/local/redis
c、启动Redis服务。
$ /usr/local/redis/redis-server /local/redis/redis.conf
d、然后用客户端测试一下是否启动成功。
$ redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
5.redis版本
1,版本号第二位为奇数,为非稳定版本(2.7、2.9、3.1)
2,第二为偶数,为稳定版本(2.6、2.8、3.0)
3,当前奇数版本是下一个稳定版本的开发版本,如2.9是3.0的开发版本
二,启动连接关闭
1. 通过配置文件启动redis服务并在后台运行:
./redis-server ./redis.conf &
2. 通过redis客户端连接redis:其中,默认host: 127.0.0.1 默认port: 6379
/redis-cli -h 127.0.0.1 -p 6379
3. 关闭客户端连接:
exit
4. 关闭服务端
/usr/local/redis/redis-cli shutdown
注意:
a.关闭时,断开连接,持久化文件生成,相对安全
b.还可以用kill 关闭redis进程,此方法不会做持久化,还会造成缓冲区非法关闭,可能造成AOF喝数据丢失
c.关闭前生成持久化文件:shutdown nosave/save
二,重要指令
1.add
expire key seconds 设置key的过期时间为seconds
set age 23 ex 10 在给键赋值的同时设置过期时间为10秒
setnx name test 创建键时校验,如果name已经存在则创建失败返回0,反之返回1.
mset name 111 age 222 address 333 desc 444 ... 批量设值
2.delete
del key 返回删除键的个数,不存在return 0
3.update
incr age 自增1,仅限于age为整数时,否则报错。
decr age 自减1,仅限于age为整数
incrby age 2 自增指定值2,仅限于age为整数
decr age 2 自减2
incrbyfloat score 2.2 浮点型,自增2.2
append name lastname 追加
4.query
keys * 查看所有键
dbsize 查看键总数
exists key 检查键值是否存在,存在return 1,否则return 0
ttl key 查看剩余的过期时间
type key 查看键的数据结构类型
mget name age address desc 批量获取值
strlen key 查询key的长度
getrange key 0 2 查询key的子字符串,范围0 2
object encoding age 查看age 的内部编码
select 2 切换数据库
5. attention
a.redis 是单线程架构
列举例子:三个客户端同时执行命令
客户端1:set name test
客户端2:incr num
客户端3:incr num
执行过程:发送指令-〉执行命令-〉返回结果
执行命令:单线程执行,所有命令进入队列,按顺序执行,使用I/O多路复用解决I/O问题,(由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务 ,IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题)
单线程快原因:纯内存访问, 非阻塞I/O(使用多路复用),单线程避免线程切换和竞争产生资源消耗
问题:如果某个命令执行,会造成其它命令的阻塞
b.redis 的String 字符串
字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB
c.redis的批量操作,mset mget 与set get 的区别
set get 执行流程
mset mget 执行流程
d. redis 密码设置
修改配置文件redis.conf 中的requirepass 的值。
启动时指定配置文件启动 ./redis-server redis.conf
客户端连接时输入密码连接 ./redis-cli -h 127.0.0.1 -p 6379 -a xxx
本地连接不需要密码也能连接成功,但没有任何权限
可以在客户端查看密码 CONFIG GET requirepass