redis相关知识

redis相关知识

redis和memcached比较?

使用redis有哪些好处?

  1. 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
  2. 支持丰富数据类型,支持string,list,set,sorted set,hash
  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
  4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

redis相比memcached有哪些优势?

  1. memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
  2. redis的速度比memcached快很多
  3. redis可以持久化其数据

Memcache与Redis的区别都有哪些?

  • 存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。
  • 数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。
  • 使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
  • redis与 memcached相比,redis支持key-value数据类型,同时支持list、set、hash等数据结构的存储。
  • redis支持数据的备份,即master-slave模式的数据备份。
  • redis支持数据的持久化。
  • redis在很多方面支持数据库的特性,可以这样说他就是一个数据库系统,而memcached只是简单地K/V缓存。

它们在性能方面差别不是很大,读取方面尤其是针对批量读取性能方面memcached占据优势。当然redis也有他的优点,如持久性、支持更多的数据结构。
所以在选择方面如果有持久方面的需求或对数据类型和处理有要求的应该选择redis。
如果简单的key/value 存储应该选择memcached。

redis中数据库默认是多少个db 及作用?

Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库

Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念

python操作redis的模块?

pyredis

import redis

r = redis.Redis(host='10.211.55.4', port=6379)
r.set('foo', 'Bar')
print r.get('foo')

如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?

通过scan_iter分片取,减少内存压力
    scan_iter(match=None, count=None)增量式迭代获取redis里匹配的的值
    # match,匹配指定key
    # count,每次分片最少获取个数
        r = redis.Redis(connection_pool=pool)
        for key in r.scan_iter(match='PREFIX_*', count=100000):
            print(key)

redis如何实现主从复制?以及数据同步机制?

https://blog.csdn.net/zhangguanghui002/article/details/78524533

redis中的sentinel的作用?

帮助我们自动在主从之间进行切换
检测主从中 主是否挂掉,且超过一半的sentinel检测到挂了之后才进行进行切换。
如果主修复好了,再次启动时候,会变成从。

启动主redis:
redis-server /etc/redis-6379.conf  启动主redis
redis-server /etc/redis-6380.conf  启动从redis

在linux中:
找到 /etc/redis-sentinel-8001.conf  配置文件,在内部:
- 哨兵的端口 port = 8001
- 主redis的IP,哨兵个数的一半/1

找到 /etc/redis-sentinel-8002.conf  配置文件,在内部:
- 哨兵的端口 port = 8002
- 主redis的IP, 1 
启动两个哨兵

如何实现redis集群?

 redis-py-cluster
    集群方案:
        - redis cluster 官方提供的集群方案。
        - codis,豌豆荚技术团队。
        - tweproxy,Twiter技术团队。
    redis cluster的原理?
        - 基于分片来完成。
        - redis将所有能放置数据的地方创建了 16384 个哈希槽。
        - 如果设置集群的话,就可以为每个实例分配哈希槽:
            - 192.168.1.20【0-5000】
            - 192.168.1.21【5001-10000】
            - 192.168.1.22【10001-16384】
        - 以后想要在redis中写值时,
            set k1 123 
          将k1通过crc16的算法,将k1转换成一个数字。然后再将该数字和16384求余,如果得到的余数 3000,那么就将该值写入到 192.168.1.20 实例中

redis中默认有多少个哈希槽?

16384

简述redis的有哪几种持久化策略及比较?

RDB:每隔一段时间对redis进行一次持久化。
– 缺点:数据不完整
– 优点:速度快

AOF:把所有命令保存起来,如果想到重新生成到redis,那么就要把命令重新执行一次。
– 缺点:速度慢,文件比较大
– 优点:数据完整

列举redis支持的过期策略。

  • voltile-lru: 从已设置过期时间的数据集(server.db[i].expires)中挑选最近频率最少数据淘汰
  • volatile-ttl: 从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  • allkeys-lru: 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

  • allkeys-random: 从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据

MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?

voltile-lru

从已设置过期时间的数据集(server.db[i].expires)中挑选最近频率最少数据淘汰

volatile-ttl

从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random

从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru

从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random 从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐)

禁止驱逐数据

写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。

如何基于redis实现消息队列?

不要使用redis去做消息队列,这不是redis的设计目标。
但实在太多人使用redis去做去消息队列,redis的作者看不下去,另外基于redis的核心代码,另外实现了一个消息队列disque:https://github.com/antirez/disque

如何基于redis实现发布和订阅?以及发布订阅和消息队列的区别?

发布者:
      import redis

      conn = redis.Redis(host='127.0.0.1',port=6379)
      conn.publish('104.9MH', "hahaha")
订阅者:
      import redis

      conn = redis.Redis(host='127.0.0.1',port=6379)
      pub = conn.pubsub()
      pub.subscribe('104.9MH')

      while True:
          msg= pub.parse_response()
          print(msg)


什么是codis及作用?

Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.

什么是twemproxy及作用?

是 Twtter 开源的一个 Redis 和 Memcache 代理服务器,主要用于管理 Redis 和 Memcached 集群,减少与Cache 服务器直接连接的数量。

写代码实现redis事务操作。

import redis

  pool = redis.ConnectionPool(host='10.211.55.4', port=6379)

  conn = redis.Redis(connection_pool=pool)

  # pipe = r.pipeline(transaction=False)
  pipe = conn.pipeline(transaction=True)
  # 开始事务
  pipe.multi()

  pipe.set('name', 'bendere')
  pipe.set('role', 'sb')

  # 提交
  pipe.execute()

  注意:咨询是否当前分布式redis是否支持事务

redis中的watch的命令的作用?

在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能。假设我们通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。

面试题:你如何控制剩余的数量不会出问题?
      - 通过redis的watch实现
          import redis
          conn = redis.Redis(host='127.0.0.1',port=6379)

          # conn.set('count',1000)
          val = conn.get('count')
          print(val)

          with conn.pipeline(transaction=True) as pipe:

              # 先监视,自己的值没有被修改过
              conn.watch('count')

              # 事务开始
              pipe.multi()
              old_count = conn.get('count')
              count = int(old_count)
              print('现在剩余的商品有:%s',count)
              input("问媳妇让不让买?")
              pipe.set('count', count - 1)

              # 执行,把所有命令一次性推送过去
              pipe.execute()
      - 数据库的锁 

基于redis如何实现商城商品数量计数器?

https://docs.lvrui.io/2018/01/29/Python实现redis的自增操作/

import redis

pool=redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)

r = redis.StrictRedis(connection_pool=pool)

r.keys()
r.incr('counter')
r.incr('counter')

简述redis分布式锁和redlock的实现机制。

在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增加一点复杂的设计就可以获得更好的可靠性。 这篇文章的目的就是尝试提出一种官方权威的用Redis实现分布式锁管理器的算法,我们把这个算法称为RedLock。

https://www.cnblogs.com/ironPhoenix/p/6048467.html
https://blog.csdn.net/junli_chen/article/details/79228282

什么是一致性哈希?Python中是否有相应模块?

https://zhuanlan.zhihu.com/p/34985026
Python模块–hash_ring,即Python中的一致性hash

如何高效的找到redis中所有以oldboy开头的key?

redis 有一个keys命令。
语法:KEYS pattern
说明:返回与指定模式相匹配的所用的keys。
该命令所支持的匹配模式如下:
(1)?:用于匹配单个字符。例如,h?llo可以匹配hello、hallo和hxllo等;
(2):用于匹配零个或者多个字符。例如,hllo可以匹配hllo和heeeello等;
(3)[]:可以用来指定模式的选择区间。例如h[ae]llo可以匹配hello和hallo,但是不能匹配hillo。
同时,可以使用“/”符号来转义特殊的字符

发表评论

电子邮件地址不会被公开。 必填项已用*标注