1.redis 单机(容量小,压力大)->主从复制(主节点读写,从节点只读)-> 哨兵sentinal(选举出新的主节点)->集群,多主多从,哈希环有16348个哈希槽,redis的key通过哈希一致性算法,和16348进行取模运算,根据得出的数值将数据存储到哪个主节点,每个节点负责一部分哈希槽。
redis是缓存数据库,存储键值对。磁盘寻址ms计算,内存寻址ns计算,比磁盘快10万倍。redis是单进程单线程单实例
redis采用epoll,多路复用nio,处理大量的连接
2.数据类型:String(字符串,数值,bitmap位图->用户登录情况,天气等),list(栈,队列),hash(哈希),set(无序不重复),sorted set(有序不重复)
3.通道subscribe 帮助命令help @subscribe,将多个命令一次性发送给redis,减少网络io,提高效率
4.事务transaction,开启事务后,指令先到达缓冲队列,谁先发送exec谁先执行
multi 开启事务,exec 执行事务,watch 监控key是否变化,如果变化事务的语句则不执行
5.持久化:
save命令:将内存中的数据以RDB(dump.rdb)文件格式持久化到硬盘,会阻塞直到复制完成后才能继续写数据
bgsave:fork() 创建子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁 盘,然后退出。写时复制技术
bgrewriteaof:将RDB文件写入到AOF文件,再append追加写操作指令到AOF文件
6.分布式锁:1.get key 2.setnx 返回true/false,如果是false,sleep(1000)睡眠1s再继续setnx,获得锁的服务执行完 后删除key
7.api:
高级api redistemplate StringRedisTemplate
低级api RedisConnection
8.缓存穿透:查询的数据redis 不存在,直接访问数据库造成数据库压力大
缓存雪崩,是指在某一个时间段,缓存集中过期失效
缓存击穿:是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的 瞬间,持续的大并发就穿破缓存,直接请求数据库
9.LRU 缓存淘汰策略:
allkeys-lru:"统计一下所有的"Key历史访问的时间,把"最老"的那个Key移除
allkeys-random :就是随机选择一个Key,将之移除
volatile-lru,它只移除那些使用 expire 命令设置了过期时间的Key
volatile-ttl,它只移除那些使用 expire 命令设置了过期时间的Key,哪个Key的 存活时间(TTL KEY 越小)越短,就 优先移除
1.安装
redis
yum install wget
wget redis安装包地址
tar -xf 安装包 解压
yun install gcc 安装c语言编译器(redis 是c语言写的)
make distclean(如果编译报错)
进入src目录,make 安装redis
启动redis src目录 ./redis-server
2.使用
16个库默认
help @组 (查看帮助)
set key value nx(新建)xx(更新)
mset k3 a k4 b
mget k3 k4
append k1 “内容” (追加)
getrange k1 start end (正方向索引)
setrange k1 start value
type key(查看类型)
strlen key (长度)
get key
getset k1 value (会返回old值)
incr 数值类型自增
decr 自减1
incrby k1 22 增加22
decrby k1 22 减22
incrbyfloat k1 0.5
keys * (查看所有key)
FLUSHDB (清库)
select 库(选择库)
连接 redis-cli -p 6379
redis-cli --raw (会触发编码集格式化,从编码中找到对应的字符)
redis 存储的时候一个字符一个字节 9999 四个字节,中文三个字节(utf8,gbk 只占两个字节),读取只按字节读取
redis 二进制安全(字节流而非字符流)
===============
help @list
l 表示左 r表示右
栈 同向命令 队列 反向命令
lpush k1 a b c d e ->e d c b a -> lpop k1 ->e
rpush k2 a b c d e -> a b c d e
lrange key start end
lindex key index (索引元素)
lset key index value
lrem k3 2 a (移除2个a,注意±2)移除元素
linsert 插入元素
llen 长度
ltrim 删除下标两端
=================
hash help @hash
hset
hget
hmset
hmget
hvals
hgetall
hincrebyfloat 数值操作
hincreby
================
set: 不重复无序集合,集合交并差操作,去重
sadd 添加
smembers 查看
srem k1 a b 移除
sinster 交集
sinterstore dest k2 k3 交集到dest
sunion 并集
sdiff 差集
srandmember 随机取出(正数,负数出现重复,0) 年会抽奖
spot 抽取一个
===================
sorted set Z开头的命令(分值排名,热歌排行),集合操作
score 排序的分值
zadd 左小右大
zrange k1 0 -1 withscoress
zrangebyscore 分值范围
rev 翻转
zscore 取出分值
zrank 取排名
zincrby 增加分值
zunionstore
排序的实现(skip list 跳跃表),增删改实现
===================