Redis-杂记

最近面试,碰到一些有关redis的问题,整理一下放这儿,希望对同样需要这些知识储备的同学有些帮助。

1、Redis(Remote Dictionary Server)的特点:

 1)速度快:基于内存的高性能key-value类型的数据库,放在内存里,更快的读写。

                     同样受限于物理内存,不能做海量数据的高性能存储。

 2)支持丰富数据结构:list、set,hash,string,sorted set

 3)持久化:RDB和AOF

 4)单进程单线程:队列技术将并发访问变为串行访问

2、Redis适合场景

 1)会话缓存

 2)全页缓存

 3)队列

 4)排行榜/计数器

 5)发布订阅

3、Redis核心功能

 1)Pipelining:管道;客户端可以一次发送多个命令给服务器,无需等待服务器的返回,而服务器则会将请求放入一个有序的管道中,在执行完成后,一次性将返回值发送给客户端

 2)Pub/Sub:解耦信息的发布/订阅通信模式

 3)Transactions:以命令方式(MULTI,EXEC.DISCARD,WA WATCH)提供了简单的类/伪事务支持,只支持ACID的一致性隔离性不保证原子性和持久性。一般将属于一个事务的命令发送给redis做缓存,最后再让redis依次执行这些命令实现Redis事务

 4)Persistence:RDB 在指定的时间间隔生成数据集的时间点快照,借助Linux的fork命令及copy on write机制,在fork出的子进程中进行备份写RDB文件,RDB备份相对简单并且文件小,无法保证数据的完整性;RDB文件有两个命令可以生成SAVE和BGSAVE。其中SAVE命令会阻塞redis的服务器进程,直到RDB文件创建完毕为止。在阻塞过程中,server不能处理任何请求 。而BGSAVE则会fork出一个子进程,然后子进程负责RDB文件的创建,父进程继续处理请求。BGSAVE做镜像全量持久化,AOF类似RDMS的binlog日志;AOF做增量持久化。

 5)Replication:Redis支持Master/Slave主从配置,实现弱一致性,支持负载均衡提高HA;常见性能问题:Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件;如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次;为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内;尽量避免在压力很大的主库上增加从库;主从复制不要用网状结构,用单向链表结构更为稳定。

4、Redis相关其他

 1)redis分布式锁:先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止忘记了释放,setnx和expire合成一条指令来用防止锁释放不了;expire设置一个键的生存时间,到时间后redis会自动删除它

2)同步机制:可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

3)淘汰策略:voltile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰;voltile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。volatile-random、allkeys-lru、allkeys-random、no-enviction禁止驱逐数据

4)Redis和memcached区别

数据类型和操作
    redis拥有更多丰富的数据结构支持和操作,而memcached则需客户端自己处理并进行网络交互
内存使用率
    简单K/V存储,Memcached内存利用率更高(使用了slab与大小不同的chunk来管理内存),如果采用redis Hash存储将其组合压缩,内存利用率高于Memcached
性能
    二者性能接近,Redis使用了单核,Memcached采用了多核,各有利弊;当数据大于100k的时候Memcached性能更高
数据持久化
    redis支持数据文件持久化,RDB与AOF两种策略;Memcached不支持,只在内存中,断电会挂掉
分布式
    Memcached本身并不支持服务器端分布式,客户端只能借助一致性哈希分布式算法来实现Memcached分布式存储;redis支持
其他方面
    redis提供其他一些功能如pub/sub,Queue简单Transaction,Replication等

5)Java API

list
    lpush
        存储数据到列表中
    lrange
        获取存储的数据
    llen
        list长度
    lpop
        获取最新插入的数据
keys(*)获取所有key
jedis.set("","")
jedis.del("")
Set
    sadd
    smembers:查看所有元素
    srem:删除某元素
    sismember查看是否在set中
Hash
    hset添加一个键值对hget
    hmset添加多个键值对
    hkeys
    hvals
sorted set
    关联一个double类型的分数,redis通过分数来为集合成员进行排序
    zadd
    zrange
    zcard:查询元素个数
    zcount查询满足条件的元素个数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值