运行位置
我自己的安装位置,放在环境变量目录里更方便
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慢