Redis的数据类型即应用场景

378 阅读2分钟

String(最基本的数据类型,二进制安全)

String是二进制安全的(不以/0作为序列化结束的标志),也就是说redis的String可以包含任何数据类型,比如说JPG图像或者是序列化对象.String类型能存储的最大值是512MB.

String就像是Java中的Map一样,一个Key对应一个Value 基本用法:

127.0.0.1:6380> set hello world
OK
127.0.0.1:6380> get hello 
"world"
127.0.0.1:6380> set counter 1
OK
127.0.0.1:6380> incr counter
(integer) 2

String底层结构

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

      // 数据空间
      char buf[];
};

应用场景:

  • 1.计数器
  • 2.对象存储(需要将对象序列化)
  • 3.分布式锁
  • 4.状态标记

redis的单步操作都是线程安全的,不存在线程安全问题


Hash(String元素组成的字典,适用于存储对象)

示例

127.0.0.1:6380> hmset panghu age 18 job student
OK
127.0.0.1:6380> hget panghu age
"18"
127.0.0.1:6380> hset panghu age 19
(integer) 0
127.0.0.1:6380> hget panghu age
"19"

应用场景

  • 1.对象存储

List列表(按照String元素插入顺序排序)

类似于栈,先进后出,数据可重复 示例

127.0.0.1:6380> lpush mylist  aaa
(integer) 1
127.0.0.1:6380> lpush mylist  bbb
(integer) 2
127.0.0.1:6380> lpush mylist  ccc
(integer) 3
127.0.0.1:6380> lrange mylist 0 10
1) "ccc"
2) "bbb"
3) "aaa"
127.0.0.1:6380> 

应用场景:

  • 消息显示排行榜 (能做与栈相关的功能)

Set(String元素组成的无序集合,通过HashTable表现,不允许重复)

示例

127.0.0.1:6380> sadd myset  111 222 
(integer) 2  #返回值代表成功添加的元素
127.0.0.1:6380> sadd myset  333 
(integer) 1
127.0.0.1:6380> sadd myset  111
(integer) 0
127.0.0.1:6380> smembers myset
1) "111"
2) "222"
3) "333"

应用场景

  • 存储一些集合性的数据
  • 获取某段时间所有数据去重值

Sorted Set(通过分数来为集合中的成员进行从大到小的排序)

具有去重的特性,还能够按照score进行排序 示例

127.0.0.1:6380> zadd myzset  3 aaa
(integer) 1
127.0.0.1:6380> zadd myzset  1 ccc
(integer) 1
127.0.0.1:6380> zadd myzset  2 bbb
(integer) 1
127.0.0.1:6380> zadd myzset  1 aaa #虽然没有成功添加,但是改变了aaa的score
(integer) 0
127.0.0.1:6380> zrangebyscore myzset 0 10
1) "aaa"
2) "ccc"
3) "bbb"
127.0.0.1:6380> 

应用场景

  • 带权重的队列
  • 进行排名

HyperLogLog

应用场景 -计数

Geo

  • 地理位置信息存储

Redis底层数据基础

1.简单动态字符串 2.链表 3.字典 4.跳跃表 5.整数集合 6.压缩列表 7.对象

参考课程:www.imooc.com/search/?wor…