Redis五大数据类型之Strings

字符串是redis最基本的数据类型。Redis字符串是二进制安全(只关心二进制化的字符串,不关心具体格式.只会严格地按照二进制的数据存取。不会妄图以某种特殊格式解析数据)的,也就是说字符串可以包含任何类型的数 据,例如JPEG图像或者序列化的Ruby对象
字符串的最大长度是512MB

使用场景

存储MySql中的某个字段的值

key:主键名:主键值:字段名
value:字段值
eg.
set user:id:1:name zhangsan

存储对象

key:主键名:主键值
value:json信息
eg.
set user:id:1 '[{"id":1,"name":"zj","name::"zhangsan"},{"id":1,"age":"24","email":"[email protected]"}]'

统计

当值是数值类型时,可以用来统计数据、计数,比如:点赞数、粉丝数。因为redis所有操作都是原子性的,所以不用担心并发问题

统计任意时间窗口内的活跃用户(值为bitmap)

假如现在有5个用户,名字分别是1 2 3 4 5

  • 如果1用户在第20190102这天登陆则
    在这里插入图片描述
  • 用户2在20190103这天登陆
    在这里插入图片描述
  • 用户3在20190102这天登陆
    在这里插入图片描述
  • 用户4在20190104这天登陆
    在这里插入图片描述
  • 用户5在20190103这天登陆
    在这里插入图片描述
  • 统计20190102到20190103这两天登陆的用户
    在这里插入图片描述
    在这里插入图片描述

统计某一个用户一年内的登陆天数

用365个二进制位表示一年的365天,如果某一天用户登陆就将对应位置设置为1,例如用户1分别在第1、5、12、34、132、134天登陆则
Redis五大数据类型之Strings_第1张图片
统计登陆天数
在这里插入图片描述

底层原理

redis中字符串没有采用C语言中传统字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string SDS)的抽象类型。

SDS

/*  
 * 保存字符串对象的结构  
 */  
struct sdshdr {  
      
    // buf 中已占用空间的长度  
    int len;  
  
    // buf 中剩余可用空间的长度  
    int free;  
  
    // 数据空间  
    char buf[];  
}; 

SDS相比C字符串的优点

  • 传统C字符串如果要获取字符串的长度,需要遍历字符串,时间复杂度为O(n),而SDS可以直接通过len获取,时间复杂度O(1)
  • 传统C字符串在修改字符串后如果不重新分配内存有可能造成缓冲区溢出或内存泄漏,如果扩充的时候不重新分配内存空间,会导致内存的溢出;如果收缩时不重新分配会导致内存泄漏。而SDS会自动根据拼接操作预先检查空间是否够用,如果不够会扩展内存,然后再拼接

你可能感兴趣的:(数据库,redis,nosql)