redis常用命令以及使用场景

String
String set key value
    get key

list
list lpush key value
list rpush key value
   lrange key 0 10

实现微博公众号的订阅消息推送


set

sadd key value
smembers key 返回set里面所有值
sismember key "1" 判断某个1是否存在于key 里,如果存在返回1.,否则返回0

sunion sadd key 合并两个set 
   smembers key

srem key value删除集合中的某个值

scard key 返回集合中的数量

实现点赞,收藏。标签

实现关注模型

sinter key1 key2 返回两个集合中公共的部分

sdiff  key1 key2 返回的差集

hash hmset myhash field1 value1 field2 value2
   hmget myhash field1
zadd key score member

命令
del key 删除某一个key
dump key 序列化某一个key
exists key 判断某一个key是否存在
expire key 设置过期时间,以秒为单位
expireat key tomestamp 设置过期时间,不过是Unix时间戳
pexpire key 设置过期时间,以毫秒为单位
pexpireat key 设置过期时间,以Unix毫秒为单位
keys pattern 查找所有复合既定模式的key
move key db 将当前数据库的key移动到给定的数据库db中
persist key 移除key的过期时间,保存为永久
pttl key 以毫秒为单位返回key的剩余过期时间
ttl key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
randomkey 从当前数据库随机返回一个key
rename key new_name 修改key的名称‘
renamenx key newkey 仅当newkey不存在时候,修改名称为newkey
type key 返回key所存储的 
   
   
save或者bgsave 保存数据
config set requirepass password 设置密码
auth password 授权密码 
config get requirepass


不一定成功,不建议使用
multi 开启事务
exec提交事务

redis分区
1:范围分区
就是映射到一定范围的对象特定的redis实例
这种方式是可行的,并且在实际中使用,不足之处就是有一个区间范围到实例的映射表,这个表要被管理,同时还需要各种对象的映射表,荣昌对redis来说并非是好的办法
2:哈希分区
hash分区,这对任何key都是适用的,无需object——name这种形式
用hash函数将key转换为一个数字,比如使用crc32 hash函数,对key执行函数crc32输出类似93024922的整数
对这个数字取模,将其转换为0-3之间的数字,就可以将这个整数映射到4个redis实例中的一个,93024922%4=2 就是说key应该内存储在R2实例中,取模操作是取余数操作


redis保持数据一致性
1.定期全量更新,将缓存全部删除,重新加载
2.给所有缓存一个过期时间
3.对删除缓存进行重试,数据的一致性要求越高,越要进行重新

并发不高的情况
读:读redis,如果没有,就查询数据库,将sql返回的数据写入redis,如果缓存有就从缓存直接读
写:先写sql,写成功再写redis

并发高的情况。
读:读redis,如果有正常返回,没有的话,读数据库。数据库返回写入redis。如果有从redis中读
写:先异步,先写入redis。直接返回,然后再定期写入数据库,可以做到多次更新,一次写入


只有被查询才应该更新缓存,

定期去清理过期缓存:缺点是需要维护大量缓存是否过期,

当有客户请求过来时,先判断这个请求所用到的缓存是否过期,过期的话,就去底层系统得到数据并更新缓存:缺点每次过来就要判断是否过期,业务逻辑比较复杂


穿透:频繁查询一个不存在的数据,由于缓存中没有,每次都要查询数据库
解决方案,数据库查询不到就缓存空结果,查询是,先查询缓存,如果存在直接返回空,没有则查询后返回,

雪崩:缓存大量失效,引起大量查询数据库
对缓存查询加锁,如果key不存在,加锁,然后在数据库里面查询进行缓存,然后解锁,其他进行如果发现有锁就等待,然后等解锁返回数据或进入数据库查询等下一步操作

redis本质是key-value的内存数据库 很想memcached,整个数据库都是加载在内存里面,定期通过一步操作把数据flush到磁盘中进行保存,因为存内存操作,所以速度比较快,可以到到100000+
支持的数据格式多,单个value最大为1G,

redis相对于memcached的优势
1.速度快很多
2.支持的数据格式比较多
3.可以持久化数据


为什么放在内存中
redis达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写进磁盘,因为redis具有快速和数据格式化的特性,如果不放在内存中,,磁盘I/O会影响redis的性能


redis集群方案什么情况下会导致整个集群不可用
在没有复制模式的的情况下,只要某个节点失败,整个集群就会缺少数据而不可用


如何保证redis中的数据都是热数据
redis内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略

使用场景
会话缓存:因为redis提供持久化操作,出现问题时可以进行恢复
队列:list和set数据类型,可以用来做消息队列使用
发布/订阅:

redis集群是否有读写操作丢失
会,redis不会保证数据的强一致性,这意味着在实际使用中集群在特定的条件下可能会丢失写操作


16384个节点,默认在0数据库,用ping测试redis是否连通,


AOF操作:以日志的形式记录每一次写操作,只需追加文件不需要改写文件,redis启动时会把日志从头到尾全部执行一遍完成数据恢复工作,因为AOF是采用追加的形式,所以导致文件越来越大
针对这个问题,新增了重写机制,当数据达到一定量的时候,会fork一条新进程来遍历进程中的数据,每条数据对应一个set语句,写入临时文件,然后替换到旧的文件,默认触发是当aof文件大小是上次重写后大小的一倍且文件大于64M时触发;

redis内存用完会发生什么
如果达到设置的上限,redis的写命令会返回错误信息或者将redis当缓存使用来配置淘汰机制,达到上限时,会冲刷掉旧的内容

redis是单线程的,如何提高CPU的利用率
可以在同一台服务器上面部署多个redis实例,把他们当做不同的服务器使用,在某些时候,无论如何一个服务器是不够用的,可以使用分片

只需要配置master
哨兵通过master获取slave,向master和slave发送info消息,获取他们的信息
哨兵定时向主从数据库的sentine:hello频道发送信息与监控这些数据库的哨兵共享自己的信息
哨兵定时向master和slave发送PING命令,监控数据库和节点有没有停止服务

发布了11 篇原创文章 · 获赞 2 · 访问量 140

猜你喜欢

转载自blog.csdn.net/sinat_38195280/article/details/88885842