-
redis有几种数据类型 5种,分别是string hash list set(无序集合) sorted set(有序集合)
-
redis内存结构
string: get set 字符串使用raw, 如果需要进行运算的字符串'100', 则会自动转换为int hash: hget hset hgetall hkeys hvals 数据较少时,使用类似一维数组的zipmap, 当成员变大时会转换为ht list: lpush lpop rpush rpop lindex 双向链表, 可以用于消息队列, 既可以作为栈,又可以作为队列 -- lset key index val 向指定索引处替换数据 -- ltrim 2 -1 表示修剪该队列的前2位
-- ltrim 2 4 修剪至2到4索引间的数据 -- lrange 0 -1 表示显示所有值
set: 无序集合,不能重复 -- sadd spop -- sinter key1 key2 返回两个集合的交集 -- sunion key1 key2 返回两个集合的并集 -- sdiff key1 key2 返回两个集合的差集 sorted set 有序集合,不可重复 -- zadd key index val 指定索引插入值 -- zrange key 0 -1 查询所有值 -
redis持久化和缓存机制
- RDB 快照模式 save 900 1 save 300 10 save 60 10000 当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write
- AOF 开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到 redis关闭前的最后时刻。
-
redis 在项目中的应用场景?
- 缓存
- 分布式锁
- 队列
-
redis运行中可能产生的问题和解决方案?
- 缓存数据和数据库一致性问题 分布式环境下,缓存数据和数据库数据容易产生不一致的情况, 我们无法保证强一致性,但是还是可以有一些策略来降低缓存不一致的概率, 比如利用MQ让数据库数据更新后,缓存异步更新. 增加缓存更新失败的重试机制.
- 缓存穿透
由于业务逻辑是在缓存中查找数据,查不到再去数据库查找. 当碰到恶意用户频繁查询redis中不存在的数据,就会有大量请求落到数据库查找.极有可能造成数据库宕机.
解决方案:- 锁机制, 单线程从数据库load数据后再释放锁,其余等待获取锁. 分布式系统就采用分布式锁 存在问题, 数据库吞吐量减少,业务逻辑增加,治标不治本
- 使用布隆过滤器判断key是否存在在容器中,判断速度极快,错误率低
- 缓存雪崩
缓存在同一时间大量key同时失效,导致大量请求来到数据库,造成数据库异常
解决方案:
- 上锁机制,同上
- 建立备份缓存A和B, A设置超时时间,B不设置超时时间 A查不到就查询B, 同时更新A和B
- 缓存并发问题 同一时间很多客户端连接更新redis同一数据, 解决方案,可以把redis的set操作放到队列里来做
-
redis设置过期时间命令 远程连接redis
redis-cli -h host -p port -a passwordexpire key second 设置缓存几秒后过期 ttl key 查看过期时间, 如果未设置过期返回-1 已过期返回-2 persist key 取消过期时间设置 pexpire key millisecond 设置毫秒 pttl key 查看过期时间这里需要说明一点的是,除了使用persist命令外,使用set命令为键赋值,也会同时消除键的生存时间,如果需要可以重新使用expire命令为键设置生存时间。而其他对键的操作命令(如incr、lpush、hset、zrem)都不会影响键的生存时间。
-
redis访问限制实现
- 用redis队列,每次访问把时间戳存入队列,队列达到十个计算首尾时间差是否超过60s. 如果超过就把尾部删除, 如果没超出就设置禁止访问
- 用户请求时,以ip加用户名作为键值,调用 incr 192.168.128.211.user 该语句会初始化一个值为1,每次调用会增加1,初始化设置过期时间为60s 键值到达10后就不能再访问. 直至60s后过期
-
redis的事务 //开启事务 multi //提交事务 exec //取消事务 discard //监控某个key watch key redis操作是原子性的,没有默认回滚机制,执行只有全部通过和全部通不过的情况.
-
redis的优点
- 速度快
- 丰富的数据类型,方便业务选择
- 有事务特性
- 特性丰富,如支持过期策略
-
redis的数据淘汰策略 redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略 )
- volatile lru 设置过期的键值里最少使用
- volatile random 设置过期的键值里随机淘汰
- volatile ttl 设置过期的键值里选择将要过期的
- allkeys lru 所有键值最少使用
- allkeys random 所有键值随机
- no-eviction 禁止淘汰
-
大数据插入 首先写上所有set 命令集,然后利用redis pipe mode 模式 cat xx.txt | redis-cli --pipe