百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis数据结构(value类型 - string)

mhr18 2024-10-31 13:24 15 浏览 0 评论

linux下操作命令

redis-cli -p 6379  //客户端连接redis
set k379:1 hello 
get k379:1  // 获取值hello
select 8  //选择db8
get k379:1  // nil

help //通过帮助学习
help @xxx  //@之后通过Tab键切换提示选择
help xxx  //可输入指定前缀,然后通过Tab键切换提示选择
help @generic  //基本组
flushDB  //清除数据

help @string
set k1 ooxx nx
get k1
set k2 hello xx
get k2
mset k3 a k4 b
mget k3 k4
append k2 " world"
getrange k2 6 10 // getrange key start end (value具备正反向索引:正向索引是指从左至右以0开始获取字符的索引;反向索引是从右至左以-1开始获取字符的索引。start、end指定索引号)
setrange k2 6 xiang
strlen k2

redis数据类型type和encoding

redisObject 用于表示 Redis 中的键值对中的值。
redisObject 的定义如下:
typedef struct redisObject {
    // 数据类型
    unsigned type:4;
    // 对象的内部编码方式
    unsigned encoding:4;
    // 引用计数
    int refcount;
    // 指向实际值的指针
    void *ptr;
} robj;


1.key里面有个基本属性type,描述的是value的类型(即数据类型)
官网:https://redis.io/commands/type/
命令:
type k1  //查看指定key(比如:k1)的value类型
2.查看Redis某个key的内部编码,可以使用Redis命令OBJECT ENCODING key,返回存储在<key>的Redis对象的内部编码。
官网:https://redis.io/commands/object-encoding/
命令:
help object
object help
object encoding k1
FLUSHALL // 移除所有key


Redis源码encoding取值有如下几种:
#define OBJ_ENCODING_RAW 0        /* Raw representation */
#define OBJ_ENCODING_INT 1        /* Encoded as integer */
#define OBJ_ENCODING_HT 2         /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3     /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5    /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6     /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7   /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8     /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9  /* Encoded as linked list of ziplists */

数据类型type

编码方式encoding(对象所使用的底层数据结构)

Strings (字符串)

int、embstr、raw

Hashes (哈希表)

ziplist、hashtable

Lists (列表)

ziplist、linkedlist、quicklist

Sets (集合)

intset、hashtable

Sorted Sets (有序集合)

ziplist、skiplist

字符串

字符串是Redis中最基本的数据类型,通常用于存储文本或二进制数据。Redis支持三种编码方式:

  • int:当字符串可以表示为整数时,Redis会将其转换为整数,并采用int编码方式存储。int编码方式的优点是存储空间小,操作效率高。缺点是只能存储整数,不支持字符串操作。
  • embstr:初始写入长度小于44字节(默认)的字符串,采用此编码方式存储,可以减少内存占用。因为初始设置保存时分配在与对象本身相同的内存中。
  • raw:保存长度大于44字节的字符串,当一个字符串比较长时,采用此编码方式存储。

列表

列表是一系列有序的字符串集合,可以添加、修改和删除元素。Redis支持三种编码方式:

  • ziplist:在Redis3.2版本之前,当List列表中每个字符串的长度都小于64字节并且List列表中元素数量小于512个时,List对象使用ziplist编码,其他情况使用linkedlist编码。ziplist是一种紧凑的、压缩的列表结构,可以节省内存。适用于小型列表。
  • linkedlist:linkedlist是一种链表结构,支持任意大小的列表。但其内存占用会随着列表长度的增加而增加。
  • quicklist:Redis 3.2版本引入,quicklist是一种由多个ziplist组成的列表结构,既能保证性能,又能节省内存。适用于大型列表。

集合

集合是一系列无序的字符串集合,支持添加、删除和查询元素。Redis支持两种编码方式:

  • intset:当集合中的元素都是整数时,Redis会采用intset编码方式存储。intset编码方式的优点是存储空间小,操作效率高。
  • hashtable:当集合中的元素包含字符串时,Redis会采用hashtable编码方式存储。hashtable编码方式的优点是可以存储任意类型的元素,支持字符串操作。缺点是存储空间相对较大,操作效率相对较低。

有序集合

有序集合是一系列无序的字符串集合,每个元素关联一个分数,可以根据分数排序。Redis支持两种编码方式:

  • ziplist:保存的元素少于128个并且所有元素大小都小于64字节使用ziplist编码,ziplist是一种紧凑的、压缩的列表结构,适用于小型有序集合。
  • skiplist:skiplist是一种跳跃表结构,支持快速查询和排序。适用于大型有序集合。

哈希表

哈希表是一系列键值对集合,每个键关联一个值。Redis支持两种编码方式:

  • ziplist:哈希对象保存的所有键值的字符串长度小于64字节并且键值对数量小于512个,Redis会采用ziplist编码方式存储。ziplist编码方式的优点是存储空间小,操作效率高。缺点是不支持快速的键查找操作。
  • hashtable:除上述条件之外,Redis会采用hashtable编码方式存储。hashtable编码方式的优点是支持快速的键查找操作。缺点是存储空间相对较大,操作效率相对较低。


二进制安全

redis是二进制安全的,redis的数据存储和读取是通过字节流的形式。在多语言中的环境下,更安全。同时也要求了写入和读取的编码解码方式要一致。

①:因为在不同的语言中对int的宽度的理解是不同的,所以一般来讲跨语言都比较喜欢实用json,xml这种文本的传输,而不使用序列化,因为容易发生数据的溢出截断。
 
由于这种情况,redis的二进制安全就是这种意思,redis只取字节流而不取字符流,因为编码、语言的不同造成的数据截断等情况不会发生,给什么存什么,不会发生字节流转换字符流出现溢出阶段,所以读取的时候客户端的编码和redis的编码一致就不会乱码,但内容实际上不会发生改变,即存的时候的编码风格只不过看的时候因为编码不一致而乱码,保证了数据存储的安全。
②:key有type和encoding 
两个过程: 
1)先进行type:value的过程,如果类型不对报错,防止程序中进行计算再出现字符串和数值相加的异常
2)再进行endcoding,防止后续字节流转换字符流计算问题,提速
 
当设置了一个key的value为int时,就会标记这个value为int,下次调用incr等计算时就直接判断encoding,就不需要转码,而是判断类型如果不合适计算就报错了,直接进入计算,这也就是redis快的一个原因,跳过了一个转码过程
③:所以在多人客户端连接一个redis时,客户端之间要沟通好编码解码

--raw编码集格式化,使用原始格式,会选择当前的客户端编码进行解码。


bitmap

linux下操作命令:

man ascii  // linux命令,查看ascii码

help @string
help setbit
setbit key offset value
help bitpos
bitpos key bit [start] [end] // 查找第一个bit(0或1)所在的位索引位置,start、end表示字节索引位置

help bitcount
BITCOUNT key [start end] // 统计位是1的个数

help bitop
BITOP operation destkey key [key ...] // 举例 bitop and newKey k1 k2表示k1和k2的value值按位与操作,写入newKey键里。


相关推荐

Docker集群管理之Docker Compose

前言:在上一篇《Docker集群管理之DockerMachine》中,我们通过源码分析了解了DockerMachine的工作原理,使用者可以通过DockerMachine的一条命令在任意支持的平...

使用Dockerfile build镜像

Docker映像可以看作是Docker容器的压缩包,包含了应用程序以及运行应用程序所需的依赖,容器是映像的运行时实例。一般构建镜像都是使用dockerfile进行构建而不是dockercommit,...

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册:Docker一键部署Immich,照片视频备份利器前言随着人们手机、PC、平板等电子产品多样,我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重...

docker容器的使用以及部署mysql

首先什么是docker官方:翻译:Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,以便您可以快速交付软件。使用Docker,您可以像管理应...

自建Docker镜像加速服务,免费且简单,服务器VPS、NAS皆可用
自建Docker镜像加速服务,免费且简单,服务器VPS、NAS皆可用

写在前面:流程十分简单,有手就行,还请耐心看完。本文的实例仅做演示用,不久后将会删除,有需要的各位请自行搭建。免费实例如果15分钟内未收到入站流量,Render会关闭实例的网络服务。Render会在下次收到处理请求时重新启动该服务。Ren...

2025-05-24 15:40 mhr18

用了8年的方式-用 Docker 瞬间搭建本地开发环境

有些时候我们需要在本地搭开发环境,比如平时学习新技术的时候。或者有时候公司的项目需要在本地建一套类似的,方便调试修改。开发环境可能包括MySQL、Redis、Nginx、MQ、Elasticsea...

使用dockerfile构建docker镜像

准备工作购买vps使用ssh工具连接上1、更新系统aptupdate-y2、一键安装Dockercurl-fsSLhttps://get.docker.com-oget-docker.sh...

快速搭建 SpringCloud 微服务开发环境的脚手架

本文适合有SpringBoot和SpringCloud基础知识的人群,跟着本文可使用和快速搭建SpringCloud项目。本文作者:HelloGitHub-秦人HelloGitHub推出...

Docker Hub最全详解(图文全面总结)

DockerHubDockerHub是一个由Docker公司负责维护的公共注册中心,它包含了超过15000多个可用来下载和构建容器的Docker镜像。DockerHub作用Docker好比一个代...

Docker 命令详解

dockerimages—查看本地镜像命令dockerimages说明列出本地已下载的所有镜像及其标签、ID、大小等信息。适用场景查看本地镜像资源、准备删除或管理镜像时。常见用法docker...

Kylin安装Dify

cd/mntgitclonehttps://github.com/langgenius/dify.gitcp/mnt/dify/docker/.env.example/mnt/dif...

kali下对Docker的详细安装

Docker是渗透测试中必学不可的一个容器工具,在其中,我们能够快速创建、运行、测试以及部署应用程序。如,我们对一些漏洞进行本地复现时,可以使用Docker快速搭建漏洞环境,完成复现学习。注:本教程仅...

银河麒麟V10使用Docker方式部署应用

现在越来越多的企业级应用需要运行在国产化环境中,而银河麒麟V10是目前我碰到的最常用的服务器,在银河麒麟上部署应用有两种方式:使用二进制文件编译部署和使用Docker。关于使用二进制文件的方式...

Docker入门到精通超详细教程,Docker全家桶实战攻略

大家好,我是各位双生的武魂、随身老爷爷。从看到这篇内容开始,你就是被选定的天命骚年,将承担起学完docker教程的使命,本使命为单向契约,你可选择YES或者选择YES。正式学习之前,我先给大家做一下d...

【Docker 新手入门指南】第一章:前言

一、基本介绍Docker介绍Docker是基于Go语言开发的开源容器化平台,旨在实现“一次镜像,处处运行”。它通过将应用程序及其依赖环境(代码、运行时、系统工具、系统库等)打包成一个轻量级、可移...

取消回复欢迎 发表评论: