可以做网站的编程有什么软件,东莞响应式网站哪里好,做一个基础的企业网站多少钱,游戏网站开发找什么人可建我们知道Redis是目前非常主流的KV数据库#xff0c;它因高性能的读写能力而著称#xff0c;其实还有另外一个优势#xff0c;就是Redis提供了更加丰富的数据类型#xff0c;这使得Redis有着更加广泛的使用场景。那Redis提供给用户的有哪些数据类型呢#xff1f;主要有它因高性能的读写能力而著称其实还有另外一个优势就是Redis提供了更加丰富的数据类型这使得Redis有着更加广泛的使用场景。那Redis提供给用户的有哪些数据类型呢主要有string(字符串)、List(列表)、Set(集合)、Hash(哈希)、Zset(有序集合)、HyperLogLogs(计算基数用的一种数据结构)、Streams(Redis 5.0提供一种建模日志用的全新数据结构)。需要注意的是这里说的数据类型是指Redis值的数据类型而Redis键的类型总是string。本文主要详解一下前5种也就是最常用的5种数据类型。剩下两种可上Redis官网(redis.io)自行了解下。另外Redis已经是目前Java程序员面试必问内容而 “Redis有哪些数据类型” 更是面试官张口就来的基础问题。如果连这第一问都过不了那基本上Redis这块已经凉凉了。string | 字符串类型redis的字符串类型可以存储字符串、整数或者浮点数。如果存储的是整数或者浮点数还能执行自增或者自减操作。并且redis的string类型是二进制安全的它可以包含任何数据比如一个序列化的对象、一个图片字节流等。不过存储大小是由上限的-512M这里解释下二进制安全的含义简单的来说就是字符串不是根据某种特殊的标志位来(C语言的\0)解析的无论输入的是什么总能保证输出是处理的原始输入而不是根据某种特殊格式来处理。redis是怎么实现string类型的二进制安全的呢答案是Sds (Simple Dynamic String简单动态字符串)Redis底层定义了自己的一种数据结构。(简单了解下)typedef char *sds;struct sdshdr {// buf 已占用长度int len;// buf 剩余可用长度int free;// 实际保存字符串数据的地方char buf[];};操作字符串的一些命令基础set、get、del命令及示例get keyname 获取存储在给定键中的值set keyname value 设置存储唉给定键中的值del keyname 删除存储在给定键中的值(通用命令适用于所有类型)127.0.0.1:6379 set happy todayOK127.0.0.1:6379 get happytoday127.0.0.1:6379 del happy(integer) 1127.0.0.1:6379 get happy(nil)127.0.0.1:6379自增和自减命令incr keyname 将键存储的值加1decr kename 将键存储的是减1incrby keyname amount 将键存储的值加上整数amountdecrby keyname amount 将键存储的值减去整数amountincrbyfloat keyname amount 将键存储的值加上浮点数amount127.0.0.1:6379 set number 1OK127.0.0.1:6379 get number1127.0.0.1:6379 incr number(integer) 2127.0.0.1:6379 get number2127.0.0.1:6379 decr number(integer) 1127.0.0.1:6379 get number1127.0.0.1:6379 incrby number 3(integer) 4127.0.0.1:6379 get number4127.0.0.1:6379 decrby number 2(integer) 2127.0.0.1:6379 get number2127.0.0.1:6379 incrbyfloat number 1.233.23127.0.0.1:6379 get number3.23子串和二进制位命令append keyname value 追加value值到指定字符串末尾getrange keyname start end 获取start到end范围的所有字符组成的子串包括start和end在内setrange keyname offset value 从偏移量 offset 开始 用 value 参数覆写(overwrite)键 keyname 储存的字符串值。getbit keyname offset 对 keyname 所储存的字符串值获取指定偏移量上的位(bit)。setbit keyname offset value 对 keyname 所储存的字符串值设置或清除指定偏移量上的位(bit)。注意redis的索引以0为开始127.0.0.1:6379 get helloworld127.0.0.1:6379 append hello ,java(integer) 10127.0.0.1:6379 get helloworld,java127.0.0.1:6379 getrange hello 2 5rld,127.0.0.1:6379 setrange hello 6 redis(integer) 11127.0.0.1:6379 get helloworld,redis127.0.0.1:6379127.0.0.1:6379 setbit bitstr 100 1(integer) 0127.0.0.1:6379 getbit bitstr 100(integer) 1127.0.0.1:6379 get bitstr\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b127.0.0.1:6379其他几个重要的命令setnx key value 只在键 key 不存在的情况下 将键 key 的值设置为 value若键 key 已经存在 则 SETNX 命令不做任何动作。setex key seconds value 将键 key 的值设置为 value 并将键 key 的生存时间设置为 seconds 秒钟。如果键 key 已经存在 那么 SETEX 命令将覆盖已有的值。说明一下SETNX 是『SET if Not eXists』(如果不存在则 SET)的简写。命令在设置成功时返回 1 设置失败时返回 0 。SETEX命令相当于SET key value 和 EXPIRE key seconds # 设置生存时间两条命令的效果但是SETEX是一个原子操作。127.0.0.1:6379 exists mark(integer) 0127.0.0.1:6379 setnx mark abcd(integer) 1127.0.0.1:6379 setnx mark defg(integer) 0127.0.0.1:6379 get markabcd127.0.0.1:6379 setex cachekey 20 ak98OK127.0.0.1:6379 get cachekeyak98127.0.0.1:6379 ttl cachekey(integer) 2List | 列表类型Redis的列表类型和许多程序语言中的列表类型类似可以有序地存储多个字符串。支持从列表的左端和右端推入或弹出元素。Redis列表的底层实现是压缩列表(redis内容自己实现的数据结构)和双端链表。看下图图片来自《Redis 设计与实现》列表操作命令详解lpush key value [value...]将一个或者多个value值插入列表的表头。如果 key 不存在会创建一个空列表并执行 LPUSH 操作。当 key 存在但不是列表类型时返回一个错误。执行 LPUSH 命令后会返回列表的长度。127.0.0.1:6379 lpush listkey a(integer) 1127.0.0.1:6379 lpush listkey a b c(integer) 4127.0.0.1:6379 lrange listkey 0 -11) c2) b3) a4) a127.0.0.1:6379list类型可以加入重复的元素这个和后面要说的set(集合类型)不同。lrange listkey 0 -1 是获取整个列表的内容类似地rpush命令是从列表右端加入元素LPOP key从列表的左端弹出一个值并返回被弹出的值127.0.0.1:6379 lrange listkey 0 -11) c2) b3) a4) a127.0.0.1:6379 lpop listkeyc127.0.0.1:6379 lrange listkey 0 -11) b2) a3) a127.0.0.1:6379lrange key start end获取列表key在给定start到end范围上的所有元素值。0表示第一个元素-1表示最后一个元素。127.0.0.1:6379 lrange listkey 0 -11) b2) a3) a127.0.0.1:6379 lrange listkey 0 11) b2) a127.0.0.1:6379lindex key index获取列表在给定index位置上的单个元素值。可以是-1代表最后一个元素-2表示倒数第二个元素以此类推。127.0.0.1:6379 lrange listkey 0 -11) b2) a3) a127.0.0.1:6379 lindex listkey 0b127.0.0.1:6379 lindex listkey -1a127.0.0.1:6379 lindex listkey 3(nil)127.0.0.1:6379blpop key [key …] timeoutblpop 是阻塞式的弹出命令它是lpop key 命令的阻塞版本。当给定列表内没有任何元素可供弹出的时候连接将被 blpop 命令阻塞直到等待超时或发现可弹出元素为止。当给定多个 key 参数时按参数 key 的先后顺序依次检查各个列表弹出第一个非空列表的头元素。因此可以分两种情况讨论一种是至少有一个key存在且是非空列表则blpop命令不会阻塞另外是blpop命令中的列表是空列表此时会在超时时间内阻塞。先看下非阻塞的场景返回值是第一个非空列表名和被弹出元素。127.0.0.1:6379 lpush list1 hello java(integer) 2127.0.0.1:6379 lpush list2 hello redis(integer) 2127.0.0.1:6379 blpop list2 list1 list3 01) list22) redis127.0.0.1:6379阻塞的场景在执行了blpop book1 book2 300 命令后会一直阻塞住。127.0.0.1:6379 exists book1(integer) 0127.0.0.1:6379 exists book2(integer) 0127.0.0.1:6379 blpop book1 book2 300阻塞在这里了这个时候我们如果在开另外一个redis客户端执行如下lpush命令往book1列表中推入一个元素。127.0.0.1:6379 lpush book1 springboot(integer) 1127.0.0.1:6379此时再回到原来阻塞的客户端已经弹出了元素。127.0.0.1:6379 exists book1(integer) 0127.0.0.1:6379 exists book2(integer) 0127.0.0.1:6379 blpop book1 book2 3001) book12) springboot(237.45s)127.0.0.1:6379通过利用Redis列表类型的阻塞式命令的特性我们最容易想到的就是可以用它实现一个简易版的消息队列。set | 集合类型Redis的集合以无序的方式存储多个不同的元素。这里要注意的是无序和不同。除了对集合能快速执行添加、删除、检查一个元素是否在集合中之外还可以对多个集合执行交集、并集和差集运算。底层实现概述Redis的集合类型底层实现主要是通过一种叫做字典的数据结构。不过Redis为了追求极致的性能会根据存储的值是否是整数选择一种intset的数据结构。当满足一定条件后会切换成字典的实现。这里大概解释下字典 其实是由一集键值对(key-value pairs)组成 各个键值对的键各不相同 程序可以添加新的键值对到字典中 或者基于键进行查找、更新或删除等操作。Redis的set(集合)在使用字典数据结构保存数据时将元素保存到字典的键里面 而字典的值则统一设为 NULL 。集合类型操作命令详解sadd key member [member...]将一个或者多个元素添加到集合key中已存在于集合中的元素将被忽略。返回新添加的元素数量不包括忽略的元素。srem key member [member...]移除集合中的一个或多个元素不存在的元素将被忽略。返回被成功移除的元素数量。sismember key meber检查元素member是否存在于集合key中。如果是返回1不是或者key不存在返回0。scard key 返回集合包含的元素数量spop key 随机移除集合中的一个元素并返回被移除元素。smembers key 返回集合中包含的所有元素127.0.0.1:6379 sadd set1 java spring redis(integer) 3127.0.0.1:6379 smembers set11) redis2) spring3) java127.0.0.1:6379 scard set1(integer) 3127.0.0.1:6379 srem set1 spring(integer) 1127.0.0.1:6379 sismember set1 spring(integer) 0127.0.0.1:6379 smembers set11) redis2) java127.0.0.1:6379 sadd set1 mysql spring(integer) 2127.0.0.1:6379 spop set1redis127.0.0.1:6379 smembers set11) mysql2) spring3) java127.0.0.1:6379下面是一些用于处理多个集合的一些命令sdiff key [key...] 返回存在于第一个集合但不存在于其他集合中的元素(数学上的差集运算)sinter key [key...] 返回同时存在于所有集合中的元素(数学上的交集运算)sunion key [key...] 返回至少存在于一个集合中的元素(数学上的并集运算)127.0.0.1:6379 smembers set11) mysql2) spring3) java127.0.0.1:6379 smembers set21) mysql2) springboot3) redis127.0.0.1:6379 sdiff set1 set21) java2) spring127.0.0.1:6379 sinter set1 set21) mysql127.0.0.1:6379 sunion set1 set21) mysql2) springboot3) java4) spring5) redis127.0.0.1:6379hash | 散列表(哈希表)Redis的hash类型其实就是一个缩减版的redis。它存储的是键值对将多个键值对存储到一个redis键里面。底层实现概述hash类型的底层主要也是基于字典这种数据结构来实现的。redis内部在实现hash数据类型的时候是使用了两种数据结构。在创建一个空的hash表时默认使用的是ziplist的数据结构满足一定条件后会转成字典的形式。散列表操作命令详解hmget hash-key key [key...] 从散列表里面获取一个或多个键的值hmset hash-key key value [key value...] 为散列表里面的一个或多个键设置值hdel hash-key key [key...] 删除散列表里面的一个或多个键值对返回删除成功的键值对的数量hlen hash-key 返回散列表包含的键值对的数量hexists hash-key key 检查给定的键是否存在于散列表中hkeys hash-key 获取散列包含的所有键hvals hash-key 获取散列包含的所有值hgetall hash-key 获取散列包含的所有键值对127.0.0.1:6379 hmset hash1 username tom email 123123 year 12OK127.0.0.1:6379 hmget hash1 email1) 123123127.0.0.1:6379 hlen hash1(integer) 3127.0.0.1:6379 hdel hash1 year(integer) 1127.0.0.1:6379 hexists hash1 year(integer) 0127.0.0.1:6379 hkeys hash11) username2) email127.0.0.1:6379 hvals hash11) tom2) 123123127.0.0.1:6379 hgetall hash11) username2) tom3) email4) 123123127.0.0.1:6379zset | 有序集合有序集合相比较于集合多个有序两个字我们知道set集合类型存储的元素是无序的那Redis有序集合是怎么保证有序的使用分值有序集合里存储这成员与分值之间的映射并提供了分值处理命令以及根据分值的大小有序地获取成员或分值的命令。底层实现概述Redis有序集合的实现使用了一种叫跳跃表的数据结构(简称跳表可自行查阅)同时也使用到了前面提到的压缩列表。也是满足一定条件的话会自行转换。有序集合操作命令详解zadd z-key score memer [score member...] 将带有给定分值的成员添加到有序集合里面zrem z-key member [member...] 从有序集合里面移除给定的成员并返回被移除成员的数量zcard z-key 返回有序集合包含的成员数量zincrby z-key increment member 将member成员的分值加上incrementzcount z-key min max 返回分值介于min和max之间的成员数量zrank z-key member 返回成员member在有序集合中的排名zscore z-key member 返回成员member的分值zrange z-key start stop [withscores] 返回有序集合中排名介于start和stop之间的成员如果给定了可选的withscores选项name命令会将成员的分值也一并返回。zrevrank z-key member 返回有序集合里成员member的排名成员按照分值从大到小排列。zrevrange z-key start stop 返回有序集合给定排名范围内的成员成员按照分值从大到小排列。zrangebyscore z-key min max 返回有序集合中分值介于min和max之间的所有成员127.0.0.1:6379 zadd zset1 10 a 12 b 1 c 3 d 20 e(integer) 5127.0.0.1:6379 zcard zset1(integer) 5127.0.0.1:6379 zcount zset1 2 10(integer) 2127.0.0.1:6379 zrank zset1 d(integer) 1127.0.0.1:6379 zscore zset1 e20127.0.0.1:6379 zrange zset1 3 51) b2) e127.0.0.1:6379 zrevrank zset1 d(integer) 3127.0.0.1:6379 zrevrange zset1 3 51) d2) c127.0.0.1:6379 zrangebyscore zset1 5 101) a127.0.0.1:6379作者Info公众号二营长的笔记闲话用技术筑起自己的风墙当外面的枪林弹雨来临的时候至少可以来个“面对疾风吧”