运行位置
我自己的安装位置,放在环境变量目录里更方便
opt/redis/src/redis-server
测试连接运行
redis-cli -p 6378 ,在ping后得到pong
shutdown 关闭redis
在cli下的命令
输入命令前缀可使用TAB补全,不区分大小写
命令 | 解释 |
---|---|
keys * | 显示所有key |
flushall | 清空所有数据库的key |
flushdb | 清空当前数据库的key |
set [key] [value] | 设置kv对 |
get [key] [value] | 根据key获取value |
del [key] | 移除key |
exists [key] | 查看是否存在 |
select [number] | 选择数据库 共16个数据库 |
expire [key ] [number] | 设置key为number秒过期 |
ttl [key] | 查看key还有多少时间过期 |
type [key] | 查询key类型 |
persist [key] | 设置永不过期 |
rename [key] [newkey] | 更改key的名字 |
move [key] [number] | 移动到number数据库 |
命令来源
可以直接去官网搜素命令
String
String可以用来存储字符串,整数,浮点数
使用上面命令的set和get就可以设置String类型的数据,可以不用加双引号,默认String类型,如果使用set设置的value是数字,则设置为数字类型。
int类的长度是c++中的long,为2^63-1
String字符是以 8 位二进制存储的
语法 | 含义 |
---|---|
STRLEN [key] | 获取key的长度 |
APPEND [key] | 拼接字符串 |
incr [key] | 自增 |
decr [key] | 自减 |
incrby [key] [num] | 增长key num个 |
decrby [key] [num] | 减少key num个 |
getrange [key] [numa] [numb] | 截取numa到numb的value字符(闭区间) |
setrange [key] [numa] [value] | value的内容,从numa开始替换value的长度 |
setex [key] [num] [value] | 设置key的value,并且过期时间为num秒 |
setnx [key] [value] | 如果不存在设置key的值,成功为1,失败为0 |
mset [key1] [value1] [key2] [value2] …. | 批量设置key value |
msetnx [key1] [value1] [key2] [value2] … | setnx的批量操作,注意是原子操作,仅当所有key都不存在时才能设置成功 |
getset [key] [value] | 获取key的旧值并设置新值 |
使用案例
- 设置key时,可以使用如下格式user:{id}:{field} id表示用户,field表示字段
- 统计文章浏览量,粉丝数
List
List可以作为栈,队列。相当于list名为key,有多个value。
List指令有一个特点,指令都是L开头
这里要说明一下,List分为左右
指令 | 解释 |
---|---|
LPUSH [list] [value] | 左压入队列list,值为value |
[L/R]PUSHX [list] [value] | 当列表存在时才执行,否则返回0 |
RPUSH [list] [value] | 右压入队列list,值为value |
LRANGE [list] [numa] [numb] | 从右向左获取numa到numb范围的value,当numa=0,numb=-1时,获取全部value。 |
LPOP [list] | 左移除value,返回移除的value |
RPOP [list] | 右移除value,返回移除的value |
Lindex [list] | 根据下标访问list |
Llen [list] | 返回list长度 |
LREM [list] [num] [value] | 移除num个value值 |
LTRIM [list] [numa] [numb] | 截取numa与numb之间的值 |
RPOPLPUSH [lista] [listb] | 右pop一个元素移动到listb中 |
LSET [list] [num] [value] | list中num位置的值更改为value |
LINSERT [list] [after/before] [value1] [value2] | 在value1前或后插入value2 |
Set
Set是无序的,其中的值不能重复,指令均为S开头
指令 | 解释 |
---|---|
sadd [set] [value] | 添加 |
sismember [set] [value] | 存在value返回1 |
smembers [set] | 获取set所有值 |
scard [set] | 获取set集合中的个数 |
srem [set] [value] | 移除某个value |
srandmember [set] | 随机获取一个value |
spop [set] | 随机移除一个元素 |
sdiff [key1] [key2] | 两个key中不一样的元素 |
sinter [key1] [key2] | 两个key的交集 |
sunion [key1] [key2] | 两个key的并集 |
Set可以用于实现不同好友的共同关注显示,粉丝列表的实现。
Hash
Hash用于保存对象,一个对象可以设置多个值
代码 | 解释 |
---|---|
hset [hash] [key] [value] | 设置字段 |
hget [hash] [key] | 根据字段获取值 |
hgetall [hash] | 获取hash的所有字段值 |
hdel [hash] [key] | 删除字段 |
hlen [hash] | 查询hash |
hexists [hash] [key] | 查看hash中的字段是否存在 |
hkeys [hash] | 获取hash所有字段 |
hvals [hash] | 获取hash中所有值 |
in/de cr [hash] [key] | 自增自减 |
Zset
在set的基础上添加顺序,一些基础用法与set相同,小的值在上面。
代码 | 解释 |
---|---|
zadd [key] [num] [value] | 根据num排序value |
zrangebyscore [key] [-inf] [+inf] (withscores) | 从小到大通过范围获取value,inf表示无穷,还可以通过withscores返回num |
zrevrange [key] [0] [-1] | 从大到小获取value |
Zset可以用于加权数据,或者实现排行榜
Hyperloglog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
代码 | 解释 |
---|---|
pfadd [key] [value1] … | 输入元素 |
pfcount [key] | 统计key的个数 |
pfmerge [key1] [key2] | 合并key1 key2 |
基数可以用来统计浏览量,不能查看value,且有小量误差1%以内
Bitmaps
位存储,两个状态都可以使用Bitmaps
代码 | 解释 |
---|---|
setbit [key] [位数] [值] | 定义值 |
getbit [key] [位数] [值] | 取值 |
bitcount [key] | 返回值为1的个数 |
事务
事务:一组命令的集合,在执行的过程中会按照顺序执行
一次性 顺序性 排他性
Redis单条命令保存原子性,但是事务不保证原子性
执行过程
- 开启事务(multi)
- 命令入队
- 执行事务 (exec)
取消事务指令:discard
监视
watch [key] 加乐观锁,在执行事务之前执行,防止执行事务中变量被更改
unwatch [key] 解锁
watch相当于记录下当前的值,如果修改失败unwatch后再次监控就好
悲观锁
认为什么时候都会出现问题,无论做什么都会加锁
乐观锁
认为什么时候都不会出问题,不会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据
Redis.conf
启动的时候,通过配置文件启动
配置文件unit单位对大小写不敏感
网络
bind ip 通过哪个ip可以访问到redis
通用
daemonize yes # 以守护进程方式运行
databases 16 #默认16个数据库
RDB配置
save 900 1
save 300 10
save 60 10000
在规定时间内修改多少次会保存
stop-writes-on-bgsave-error yes
持久化失败后仍然运行
rdbcompression yes
压缩RDB文件,需要消耗cpu资源
rdbchecksum yes
保存RDB文件时校验文件
dbfilename dump.rdb
RDB 文件保存名称,不能写成目录 这个文件默认在 /root下
安全
执行指令设置密码
config set requirepass password
获取密码
config get requirepass password
登录
auth password
限制
maxclients 10000
默认最大客户端数目10000
maxmemory
默认最大内存信息
maxmemory-policy noeviction
内存达到上限后的策略
- volatile-lru:采用最近使用最少的淘汰策略,Redis将回收那些超时的(仅仅是超时的)键值对,也就是它只淘汰那些超时的键值对。
- allkeys-lru:采用最近最少使用的淘汰策略,Redis将对所有(不仅仅是超时的)的键值对采用最近最少使用的淘汰策略。
- volatile-lfu:采用最近最不常用的淘汰策略,所谓最近最不常用,也就是一定时期内被访问次数最少的。Redis将回收超时的键值对。
- allkeys-lfu:采用最近最不常用的淘汰策略,Redis将对所有的键值对采用最近最不常用的淘汰策略。
- volatile-random:采用随机淘汰策略删除超时的键值对。
- allkeys-random:采用随机淘汰策略删除所有的键值对,这个策略不常用。
- volatile-ttl:采用删除存活时间最短的键值对策略。
- noeviction:不淘汰任何键值对,当内存满时,如果进行读操作,例如get命令,它将正常工作,而做写操作,它将返回错误,也就是说,当Redis采用这个策略内存达到最大的时候,它就只能读不能写了。
AOF配置
appendonly no
默认不开启AOF,使用RDB持久化
appendfsync always //每个操作都同步,消耗性能
appendfsync everysec //每秒同步
appendfsync no //不同步
在开启AOF后,Redis优先加载AOF文件
redis-check-aof –fix 修复aof文件,可能把错误的指令删除
- 优点
- 每一次求改都同步,文件完整性会更好
- 缺点
- 修复速度很慢
- aof运行效率也比rdb慢