一共有16个数据库
set name " "
设置一个键值对
get name
得到Key对应的value
EXPIRE name 10
10秒钟后自动过期
select 3
切换到第三个数据库
DBSIZE
数据库大小
FLUSHALL
清空全部数据库
flushdb
清空当前数据库
Redis-key
String
EXISTS name
判断这个key是否存在
move name 1
将当前name移除
tpye name
查看name什么类型
append name
"123" 将123添加到name对应的value后面 比如”456“ ”456123“
INCR key
对存储在指定key
的数值执行原子的加1操作。
如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0
。
如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,
那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。
这个操作仅限于64位的有符号整型数据。
DECR key
与上面刚好相反
INCRBY key increment
将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。
如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
GETRANGE key 0 3
得到一个范围[0,3]
SETRANGE key 1 xx
指定位置的字符串变为xx
setex (set with expire)
mset k1 v1 k2 v2 k3 v3 (原子操作) 要么全部成功要么全部失败
批量设置
set usr:1 {name:lhb age:20}
设置一个对象
getset db redis
先获取再设置
List操作
LPUSH list one
将一个值或者多个值插入到列表的头部 LEFTPUSH
LRANGE list 0 -1
(全部)
LRANGE list 0 1
(从后往前的 两个)
解释: 先插入one 然后再在左边插入two 变为 two one 然后再在右边插入three 变为 two one three
LPOP list
移除List左边第一个
RPOP
移除List右边第一个
lindex list 3
或者下标为3的值
lset list 0 item
将下标为0变为item,一个更新操作 如果不存在列表 或者列表为这个下标会报错。
lrem list 1 one
移除为one的一个值 精确匹配
ltrim list 1 2
只保留 1 2范围内的值
rpoplpush list myotherlist
将list的第一个元素删除然后加入myotherlist中
linsert list before "world" four
往world 后面插入four
SET操作(不能重复)
sadd myset hello
往myset里面添加
smembers myset
smembers myset hello
判断Hello是否存在
scard myset
获取值的个数
srem myset hello
删除值
srandmemmber myset
随机抽出一个数
spop myset
随机删除元素
spop myset 2
删除第二个元素
smove myset myset1 hello
将指定的元素移动到另外的set
sunion myset myset1
取交集
sinter myset myset1
取并集
sdiff myset myset1
取差集
HASH
一个集合
hset myhash key1 value
hget myhash key1
hgetall myhash
http://redis.cn/commands.html#hash
GEO
zrem
zrange 都可以
geoadd
geopos
getbit
setbit
bitcount sign 统计为1的数量
事务
redis 单条命令是原子性,事务不具有原子性
一次性 顺序性 排他性 没有隔离级别的概念,所有命令在事务中并没有被执行,只有发起执行命令才会被执行
一条编译时命令有错,所有的命令都不被执行
一条命令运行时错误,只有那条命令不被执行
悲观锁:很悲观,无论干什么都加锁 影响性能
乐观锁:可以用watch来实现乐观锁,更新之前先检查版本。
redis配置文件
bind 127.0.0.1 -::1//ip默认是本地Ip地址只能本地连接可以修改为外网ip
bind 127.0.0.1 -::1//保护模式默认开启
port 6379 //端口号是6379 可以修改
daemonize yes//是否是后台程序
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice//默认日志级别
logfile ""//日志输入地址
stop-writes-on-bgsave-error yes //持久化失败时是否关闭
381 # save 3600 1
382 # save 300 100
383 # save 60 10000
如何持久化
rdbcompression yes//rdb是否压缩
454 dir ./ 持久话文件的地址 当前目录
1021 # maxmemory-policy noeviction key多了以后的淘汰策略
持久化
rdb
1.满足save的条件下会自动触发rdb规则
2.执行flushall命令
3.退出redis
优点:
1.适合大规模数据恢复
2.对数据完整性要求不高
缺点:
1.需要一定时间间隔进行操作,如果意外宕机那么最后一次修改就没有了
2 fork进程会占用一定的内存空间
AOF
将所有的命令都记录下来
每次重启都是讲命令一遍遍的执行
默认关闭可以修改配置文件
1252 appendonly no//可以修改为yes变为AOF操作
redis-check-aof --fix 恢复AOF文件
1281 # appendfsync always
1282 appendfsync everysec
1283 # appendfsync no
每一次修改都同步
每一秒同步
从不同步
缺点:
1.aof大于rdb数据,修复速度比rdb慢
2.aof运行效率也比rdb慢
主从复制
将一台redis服务器数据复制到其他redis服务器,复制是单向的只能从主节点复制到从节点。
主从复制,读写分离,80%情况进行读操作
作用:
1.故障恢复,当主节点发生故障的时候,可以由从节点提供服务,实现快速的故障恢复
2.负载均衡,在主从复制的基础上实现读写分离,主节点进行写,从节点提供读服务,分担服务器负载。在读多写少的情况下由
从节点分担读的压力可以大大提高redis服务器的并发效率
3.数据备份
1从结构上一台服务器可能发生故障,一台服务器需要处理所有的请求负载压力大
2.单台服务器内存容量有限,最多不能超过20G
操作:
1.修改配置文件:
1)修改端口号
2)修改日志默认输出文件名
3)修改rdb文件名
4)修改守护进程pid文件名
2.SLAVEOF 127.0.0.1 6379(主机变成从机)
测试:主机断了 从机依旧连接到主机,因为主机断了所以没有写操作,如果主机回来了,从机依旧可以获取主机写的。
如果从机断了,如果是用命令行配置的主从复制,如果重启自动变为主机,但如果变成从机数据立马同步
全量复制:只要重新连接到主机一定执行一次全量复制,数据一定可以在从机中看到
增量复制:就是主机的每一次写操作。
哨兵模式
哨兵是一个独立的进程,通过向redis服务器发送命令,等待redis服务器的响应,从而监控多个redis实例
在后台监控主机是否发生故障,如果发生故障根据投票数自动将从库切换为主库
一个哨兵可能会发生问题,所以多个哨兵之间相互监听
缓存穿透和雪崩
缓存穿透
当用户查询数据缓存和数据库都没有,当用户很多都没有缓存,都去数据库查询会给数据库造成很大的压力。
解决方法:
1布隆过滤器(过滤一些无用的请求)
2缓存空对象(需要更多的空间)
缓存击穿(单一数据)
指缓存中没有而数据库中有,同一时间读取缓存中没有而去数据库中查询
解决方案:
1热点数据永不过期
2.加分布式锁
雪崩(很多数据)
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机
解决方法:
1.热点数据永不过期
2.过期时间变得随机