redis网络通信模块设计与实现分析

redis的通信模块封装得非常简单易用,可以直接用到自己项目中,学习下也是很有价值的。

本文基于redis源码4.0.1写成,redis源码下载:https://github.com/antirez/redis/archive/4.0.1.tar.gz

文件结构

redis的网络通信模块由8个文件构成

作用如下

文件 作用
ae.c 统一epoll、evport、kqueue、select网络事件处理接口, 函数实现
ae.h 统一epoll、evport、kqueue、select网络事件处理接口,函数原型,共享结构体定义
ae_epoll.c 封装epoll网络事件处理库到统一的接口
ae_evport.c 封装evport网络事件处理库到统一的接口
ae_kqueue.c 封装kqueue网络事件处理库到统一的接口
ae_select.c 封装select网络事件处理库到统一的接口

统一网络库底层接口

被统一的网络事件处理接口如下,参考:ae_epoll.c, ae_evport.c, ae_kqueue.c, ae_select.c

Read more   2019/8/9 posted in  源码分析 Redis

完整阿里云 Redis 开发规范

本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。

  • 键值设计
  • 命令使用
  • 客户端使用
  • 相关工具

通过本文的介绍可以减少使用Redis过程带来的问题。

一、键值设计

1、key名设计

可读性和可管理性

Read more   2018/4/13 posted in  规范 Redis

查找redis中的大key

python find_bigkey.py host 6379 [password]
import sys
import redis
 
 
def find_big_key_normal(db_host, db_port, db_password, db_num):
  client = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)
  i=0
  temp = client.scan(cursor=i,count=1000)
  j =0
  while temp[0]>0 :
    i=temp[0]
    j=j+len(temp[1])
    try:
      r = client.pipeline(transaction=False)
      for k in temp[1]:
        r.debug_object(k)
      tempA = r.execute()
      x = 0
      for key in tempA:
        length = key.get("serializedlength")
        ##type = key.get("encoding")
        if length > 10240 :
          type = client.type(temp[1][x])
          print temp[1][x], type,length
        x=x+1
    except :
      print "a execption come"
    temp = client.scan(cursor=i,count=1000)
 
   
if __name__ == '__main__':
  if len(sys.argv) != 4:
     print 'Usage: python ', sys.argv[0], ' host port password '
     exit(1)
  db_host = sys.argv[1]
  db_port = sys.argv[2]
  db_password = sys.argv[3]
  r = redis.StrictRedis(host=db_host, port=int(db_port), password=db_password)
  nodecount = 1
  keyspace_info = r.info("keyspace")
  for db in keyspace_info:
    print 'check ', db, ' ', keyspace_info[db]
    find_big_key_normal(db_host, db_port, db_password, db.replace("db", ""))
删除缓存key: EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 cpx_sn_
EVAL "local keys = redis.call('keys', ARGV[1]) \n for i=1,#keys,5000 do \n redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) \n end \n return keys" 0 prefix:*
2016/5/20 posted in  Redis