redis基本数据类型
mhr18 2024-12-02 18:16 37 浏览 0 评论
字符串-String
字符串类型是redis的基础数据类型。首先,键都是字符串类型。字符串类型的值可以是字符串(简单字符串或者JSON/XML)、数值(整数和浮点数),二进制(图片,音频和视频),但是最大不能超过512MB。
数据结构
redis字符串使用SDS结构存储。
我们都知道redis是使用C语言编写的,那么字符串为什么不使用C语言的字符串而要自己定义一套SDS结构呢,相比于C语言的字符串SDS结构有如下优点:
1、查询复杂度低,O(1)
2、自定义结构,封装自己字符串处理函数,可以处理\0
3、预分配空间和惰性回收减少系统调用和内存碎片
常见指令
set:set key value 设置值
setnx:setnx key value 只有在key不存在值时才能设置成功
get:get key 获取指定key的值
getrange key start end 返回字符串指定的子字符串,从0开始
mget:mget key1 key2 获取多个key的值
getset:getset key value 给指定的key设置新值并返回旧值
getbit:getbit key offset 获取key对应字符串对应offset偏移量上的位(二进制)
setbit:setbit key offset value 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
setex:setex key seconds value 设置key值并指定过期时间,单位为秒
setrange:setrange key offset value 指定位置替换值
strlen:返回key 所储存的字符串值的长度
mset:mset key value key value 同时设置多个键值对
msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
psetex:psetex key mis value 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位
incr:key中的值加一
incrby:key in 值加上指定值
decr:作用与incr相反
decrby:作用与incrby相反
append:字符串追加值
场景
1、缓存;可以存储字符串、数值、图片、系列化的对象
2、利用setnx的特性设计分布式锁
3、利用incr、incrby、decr、decrby设计计数器
3、共享数据
哈希-Hash
数据结构
redis哈希存储有两种数据结构:dict和zipList
当hash对象可以同时满足一下两个条件时,哈希对象使用ziplist编码:
1.哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
2.哈希对象保存的键值对数量小于512个
dict
typedf struct dict{
// 类型特定函数,包括一些自定义函数
// 这些函数使得key和value能够存储
dictType *type;
// 私有数据
void *private;
// 两张hash表
dictht ht[2];
// rehash索引,字典没有进行rehash时,此值为-1
int rehashidx;
// 正在迭代的迭代器数量
unsigned long iterators;
}dict;
typedf struct dictht{
// 存储数据的数组 二维
dictEntry **table;
// 数组的大小
unsigned long size;
// 哈希表的大小的掩码,用于计算索引值
// 总是等于 size-1
unsigned long sizemask;
// 哈希表中中元素个数
unsigned long used;
}dictht;
typedf struct dictEntry{
// 键
void *key;
// 值
union{
void val;
unit64_t u64;
int64_t s64;
double d;
}v;
// 指向下一个节点的指针
struct dictEntry *next;
}dictEntry;
dict主要使用两张hash表存储数据,hash表中定义entity数据<k,value>的结构存储key和value的值,采用两张hash表的形式进行扩容和rehash,可参考https://blog.csdn.net/qq_33333654/article/details/127212465进行了解。
常用指令
hdel:hdel key field1 field2 删除一个或多个hash表的字段
hexists:hexists key field 查看key中指定的字段是否存在,存在返回1否则返回0
hget:hget key field 获取key中指定的filed字段的值
hgetall:hgetall key 获取key中所有字段和值
hincrby:hincrby key filed inc 哈希表 key 中的指定字段的整数值加上增量 increment
hkeys:hkeys key获取哈希表中的所有字段
hlen:hlen key 获取哈希表中字段的数量
hmget:hmget key field1 field2 获取所有给定字段的值
hmset:hmset key field value field1 value 将多个字段和值设置给指定的key
hset:hset key field value 设置值
hsetnx:只有在字段 field 不存在时,设置哈希表字段的值。成功返回1,失败返回0
hvals:获取哈希表中所有值
场景
存储对象数据
购物车
列表-List
数据结构
linkedList
//定义链表节点的结构体
typedf struct listNode{
//前一个节点
struct listNode *prev;
//后一个节点
struct listNode *next;
//当前节点的值的指针
void *value;
}listNode;
使用双向链表实现,pre指向前一个节点,next指针指向后一个节点,value保存着当前节点对应的数据对象
zipList
typedf struct ziplist<T>{
//压缩列表占用字符数
int32 zlbytes;
//最后一个元素距离起始位置的偏移量,用于快速定位最后一个节点
int32 zltail_offset;
//元素个数
int16 zllength;
//元素内容
T[] entries;
//结束位 0xFF
int8 zlend;
}ziplist
优点:
1、采用连续内存存储,减少了许多内存碎片和指针的内存占用,进而节约了内存。适合列表对象中元素的长度较小或者数量较少时。
缺点:
1、不利于修改操作,插入和删除操作需要频繁地申请和释放内存。特别是当zipList长度很长时,一次realloc可能会导致大量的数据拷贝。
quickList
qucikList是由zipList和双向链表linkedList组成的混合体。它将linkedList按段切分,单个节点使用zipList来紧凑存储,多个zipList之间使用双向指针串接起来。示意图如下所示:
常用指令
lpush key value value1:将一个或多个数据插入列表头部
rpush key value vlue1:将一个或多个数据插入列表尾部
lpop key:移出并获取列表的第一个元素
rpop key:移出并获取最后一个元素
blpop key timeout:移出并获取第一个元素,如果列表中没有元素会阻塞列表直到指定时间
llen key:列表长度
lindex key index:通过索引获取列表中的元素
场景
1、日志记录,利用lpush插入数据,rpop读取数据模拟mq消息队列异步处理日志数据
2、抽奖、抢票。list是线程安全的,所有pop操作是原子性的,适用于抽奖,抢票等场景,用来防止超卖问题,可以分为以下三步进行:
a,将奖品打散放入redis list中
b,执行pop命令进行抽奖
c,数据库中写入抽奖记录
3、流量削峰,将所有的请求全部放到list中,然后开启多个线程来处理后续请求,减轻服务器压力,用来处理一些高并发场景。
集合-Set
数据结构
其底层有两种实现方式:
1.当value是整数值时,且数据量不大时使用inset来存储,
2.其他情况都是用字典dict来存储
inset的结构:
typedf struct inset{
uint32_t encoding;//编码方式 有三种 默认 INSET_ENC_INT16
uint32_t length;//集合元素个数
int8_t contents[];//实际存储元素的数组
//元素类型并不一定是ini8_t类型,柔性数组不占intset结构体大小,并且数组中的元
//素从小到大排列
}inset;
常用命令
命令 描述
sadd key value1 [value2] :向集合添加多个元素,如元素存在则忽略. 如集合key不存在,则新建集合key
scard key:返回集合成员数量
smembers key:返回集合中的所有成员
sismember key member:判断 member 元素是否是集合 key 的成员,是返回1 ,如不是或key不存在返回0
srem key member1 [member2]:移除集合中一个或多个成员,如成员不存在则忽略,如key不存在返回0
spop key [count]:从存储在key的集合中移除并返回一个或多个(count)随机元素
srandmember key [count]:返回集合中一个或多个随机元素
smove source destination member:将member元素从source集合移动到destination集合中,如source中元素不存在返回0,如source中元素存在且destination中也存在,则只删除source中元素
sdiff key1 [key2]:返回给定的第一个集合和其他集合的差集.(即key1中的值,在其他key中找不到)
sdiffstore destination key1 [key2]:返回给定的第一个集合与其他的集合的差集并存储在destination中,如果destination已经存在, 则将其覆盖重写
sinter key1 [key2]:返回所有集合的交集(所有key的值中相同的值)
sunion key1 [key2]:返回所有集合的并集(所有key的值合并去重的值)
场景
1、利用值的唯一性,和集合提供的,对两个集合间的数据进行交集、并集、差集运算的操作,来推荐好友和获取共同好友等
2、利用值的唯一性,可以统计访问网站的所有独立 IP
有序集合-Zset
数据结构
zset在Redis中两种不同的实现,分别是zipList和skipList
常用命令
ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key
获取有序集合的成员数
ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
ZINTERSTORE destination numkeys key [key ...]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
ZLEXCOUNT key min max
在有序集合中计算指定字典区间内成员数量
ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合指定区间内的成员
ZSCORE key member
返回有序集中,成员的分数值
场景
1、排行榜
2、延时队列
- 上一篇:Redis为什么默认16个数据库?
- 下一篇:如何设计一个任务系统
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)