Redis 数据类型

Redis 数据类型说明

redis是键值对的数据库,有5中主要数据类型:

  • 字符串类型(string)
  • 散列类型( 哈希hash)
  • 列表类型(list)
  • 集合类型(set)
  • 有序集合类型(zset)

Redis 数据类型应用场景实现

字符串类型(string)

Strings 数据结构是简单的key-value类型,value根据命令和内容保存两种字符串和数字。

常用命令: set,get,decr,incr,mset,mget 等。

Redis 数据类型应用场景

1、String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类。保存系统内容的缓存。

2、String是的decr,incr命令做数字的自增长功能,还有做锁的功能incr命令为1时,代表取得锁大于1表示取锁失败

散列类型(哈希hash)

散列类型(哈希hash)是一个string类型的field和value的映射表。添加和删除操作都是O(1)(平均)的复杂度。hash类型特别适合用于存储对象。

常用命令:hget,hset,hgetall 等。

散列类型(哈希hash)应用场景

把整个数据结构或者对象保存到哈希hash,Key是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值。

以 Java 对象来举例说明:

  package com.mainboot.mainbootAdmin.model;

import javax.persistence.*;

public class User {

    private Integer id;

    private Integer ucUid;

    private String username;

    private String password;

    private String email;
 
    private Boolean gender;

    private String intro;

    private String province;

    private String city;

    private Integer score;
 
    private Integer scoreLevel;

    private String qq;

    private String address;

    private String realname;

    private String mobile;

    private Boolean status;
 //set get方法省略
}
  
可以把对象User 的id当作key,把其他成员属性都放到这个散列类型(哈希hash)中。

注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。

列表类型(list)

Redis 列表类型(list)是简单的字符串列表,按照插入顺序排序。

常用命令:lpush,rpush,lpop,rpop,lrange等。

Redis 列表类型(list)应用场景

列表在使用的场景非常多:

  • 网站上的各种热闹文章。
  • 微博的关注或粉丝列表。
  • 代码上一些使用到队列的场景等

集合类型(set)

Redis 集合类型(set) 是 String 类型的无序集合,集合成员是唯一的。

常用命令:sadd,spop,smembers,sunion 等。

Redis 集合类型(set)应用场景

集合在使用的场景好友推荐功能[如果双方有共同好友] 。

有序集合类型(zset)

Redis 有序集合类型(zset)是set 的一个升级版本,它在 set 的基础上增加了一个顺序属性(score),这个属性在添加修改元素的时候可以指定,每次指定后,zset 会自动更新按照新的值调整顺序。

常用命令:zadd,zrange,zrem,zcard等。

Redis 有序集合类型(zset)应用场景

集合在使用的场景:各种排行榜的实现。

Redis 数据类型实现方式

字符串类型(string)

String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

散列类型( 哈希hash)

上面已经说到Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

列表类型(list)

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

集合类型(set)

set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

有序集合类型(zset)

Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

Copyright © 2019-2019主引教程mainboot.com All Rights Reserved. 备案号: 闽ICP备13019624号-4