数据结构和内部编码
单线程
1、一次只运行一条命令
2、拒绝长(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
3、其实不是单线程
fysnc file descriptor
close file descriptor
单线程为什么这么快
1、纯内存
2、非阻塞IO
3、避免线程切换和竞态消耗
String
例子
1、用用户ID作为key,将用户的信息包装成一个对象(或者说是一个json、xml),可以通过用户ID获取用户信息,如果需要修改则需要将用户信息序列化后,重新存入Redis中
2、(更新User的age为41)每一个key就是一个属性,相对于第一种而言,每更新一次只需直接更新对应的key的value,不需要每次将信息序列化后存入Redis中
3、 可以根据hash key的属性直接更新用户的某一个属性的信息,或者添加一个新的属性
三种方案比较
命令 | 优点 | 缺点 |
String v1 | 1、编程简单 2、可能节约内存(跟第二种方案比),另外是否节约内存取决于格式化、序列化、标准化的一个方式 | 1、序列化开销(CPU) 2、设置属性要操作整个数据 |
String v2 | 1、直观(每一个属性设置一个key,可以部分更新) | 1、内存占用较大 2、key较为分散,不便于管理 |
Hash | 1、直观(符合传统关系数据库的特点) 2、节省空间 3、可以部分更新 | 1、编程稍微复杂 2、ttl(过期时间)不好控制【Hash除了字符串以外,没有可以设置二级结构中的具体的一个值的或者说一个属性的过期时间】 |
Hash
List(列表)
特点:
- 有序
- 可以重复
- 左右两边插入弹出
Set
特点:
- 无序
- 无重复
- 集合间的操作
Zset (有序集合)
通过score来进行排序