建网站多少钱 优帮云/黄冈网站推广软件视频下载

建网站多少钱 优帮云,黄冈网站推广软件视频下载,域名暂无法进行网站备案,天津铁路建设投资控股(集团)网站我们知道Redis是目前非常主流的KV数据库,它因高性能的读写能力而著称,其实还有另外一个优势,就是Redis提供了更加丰富的数据类型,这使得Redis有着更加广泛的使用场景。那Redis提供给用户的有哪些数据类型呢?主要有&…

我们知道Redis是目前非常主流的KV数据库,它因高性能的读写能力而著称,其实还有另外一个优势,就是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 today

OK

127.0.0.1:6379> get happy

"today"

127.0.0.1:6379> del happy

(integer) 1

127.0.0.1:6379> get happy

(nil)

127.0.0.1:6379>

自增和自减命令

incr keyname 将键存储的值加1

decr kename 将键存储的是减1

incrby keyname amount 将键存储的值加上整数amount

decrby keyname amount 将键存储的值减去整数amount

incrbyfloat keyname amount 将键存储的值加上浮点数amount

127.0.0.1:6379> set number 1

OK

127.0.0.1:6379> get number

"1"

127.0.0.1:6379> incr number

(integer) 2

127.0.0.1:6379> get number

"2"

127.0.0.1:6379> decr number

(integer) 1

127.0.0.1:6379> get number

"1"

127.0.0.1:6379> incrby number 3

(integer) 4

127.0.0.1:6379> get number

"4"

127.0.0.1:6379> decrby number 2

(integer) 2

127.0.0.1:6379> get number

"2"

127.0.0.1:6379> incrbyfloat number 1.23

"3.23"

127.0.0.1:6379> get number

"3.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 hello

"world"

127.0.0.1:6379> append hello ,java

(integer) 10

127.0.0.1:6379> get hello

"world,java"

127.0.0.1:6379> getrange hello 2 5

"rld,"

127.0.0.1:6379> setrange hello 6 redis

(integer) 11

127.0.0.1:6379> get hello

"world,redis"

127.0.0.1:6379>

127.0.0.1:6379> setbit bitstr 100 1

(integer) 0

127.0.0.1:6379> getbit bitstr 100

(integer) 1

127.0.0.1:6379> get bitstr

"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b"

127.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) 0

127.0.0.1:6379> setnx mark abcd

(integer) 1

127.0.0.1:6379> setnx mark defg

(integer) 0

127.0.0.1:6379> get mark

"abcd"

127.0.0.1:6379> setex cachekey 20 ak98

OK

127.0.0.1:6379> get cachekey

"ak98"

127.0.0.1:6379> ttl cachekey

(integer) 2

List | 列表类型

Redis的列表类型和许多程序语言中的列表类型类似,可以有序地存储多个字符串。

支持从列表的左端和右端推入或弹出元素。Redis列表的底层实现是压缩列表(redis内容自己实现的数据结构)和双端链表。看下图

2aa4927b37c33af5262fbffc2e791093.png

图片来自《Redis 设计与实现》

列表操作命令详解

lpush key value [value...]

将一个或者多个value值插入列表的表头。如果 key 不存在,会创建一个空列表并执行 LPUSH 操作。当 key 存在但不是列表类型时,返回一个错误。

执行 LPUSH 命令后,会返回列表的长度。

127.0.0.1:6379> lpush listkey a

(integer) 1

127.0.0.1:6379> lpush listkey a b c

(integer) 4

127.0.0.1:6379> lrange listkey 0 -1

1) "c"

2) "b"

3) "a"

4) "a"

127.0.0.1:6379>

list类型可以加入重复的元素,这个和后面要说的set(集合类型)不同。

lrange listkey 0 -1 是获取整个列表的内容

类似地rpush命令是从列表右端加入元素

LPOP key

从列表的左端弹出一个值,并返回被弹出的值

127.0.0.1:6379> lrange listkey 0 -1

1) "c"

2) "b"

3) "a"

4) "a"

127.0.0.1:6379> lpop listkey

"c"

127.0.0.1:6379> lrange listkey 0 -1

1) "b"

2) "a"

3) "a"

127.0.0.1:6379>

lrange key start end

获取列表key在给定start到end范围上的所有元素值。

0表示第一个元素,-1表示最后一个元素。

127.0.0.1:6379> lrange listkey 0 -1

1) "b"

2) "a"

3) "a"

127.0.0.1:6379> lrange listkey 0 1

1) "b"

2) "a"

127.0.0.1:6379>

lindex key index

获取列表在给定index位置上的单个元素值。

可以是-1,代表最后一个元素,-2表示倒数第二个元素,以此类推。

127.0.0.1:6379> lrange listkey 0 -1

1) "b"

2) "a"

3) "a"

127.0.0.1:6379> lindex listkey 0

"b"

127.0.0.1:6379> lindex listkey -1

"a"

127.0.0.1:6379> lindex listkey 3

(nil)

127.0.0.1:6379>

blpop key [key …] timeout

blpop 是阻塞式的弹出命令,它是lpop key 命令的阻塞版本。当给定列表内没有任何元素可供弹出的时候,连接将被 blpop 命令阻塞,直到等待超时或发现可弹出元素为止。

当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。

因此可以分两种情况讨论,一种是至少有一个key存在且是非空列表,则blpop命令不会阻塞,另外是blpop命令中的列表是空列表,此时会在超时时间内阻塞。

先看下非阻塞的场景,返回值是第一个非空列表名和被弹出元素。

127.0.0.1:6379> lpush list1 hello java

(integer) 2

127.0.0.1:6379> lpush list2 hello redis

(integer) 2

127.0.0.1:6379> blpop list2 list1 list3 0

1) "list2"

2) "redis"

127.0.0.1:6379>

阻塞的场景,在执行了blpop book1 book2 300 命令后会一直阻塞住。

127.0.0.1:6379> exists book1

(integer) 0

127.0.0.1:6379> exists book2

(integer) 0

127.0.0.1:6379> blpop book1 book2 300

阻塞在这里了

这个时候,我们如果在开另外一个redis客户端,执行如下lpush命令往book1列表中推入一个元素。

127.0.0.1:6379> lpush book1 springboot

(integer) 1

127.0.0.1:6379>

此时,再回到原来阻塞的客户端,已经弹出了元素。

127.0.0.1:6379> exists book1

(integer) 0

127.0.0.1:6379> exists book2

(integer) 0

127.0.0.1:6379> blpop book1 book2 300

1) "book1"

2) "springboot"

(237.45s)

127.0.0.1:6379>

通过利用Redis列表类型的阻塞式命令的特性,我们最容易想到的就是可以用它实现一个简易版的消息队列。

set | 集合类型

Redis的集合以无序的方式存储多个不同的元素。这里要注意的是无序和不同。

除了对集合能快速执行添加、删除、检查一个元素是否在集合中之外,还可以对多个集合执行交集、并集和差集运算。

底层实现概述

Redis的集合类型底层实现主要是通过一种叫做字典的数据结构。不过Redis为了追求极致的性能,会根据存储的值是否是整数,选择一种intset的数据结构。当满足一定条件后,会切换成字典的实现。

e126a8f7b9fea14f6b668442bdad201b.png

这里大概解释下字典: 其实是由一集键值对(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) 3

127.0.0.1:6379> smembers set1

1) "redis"

2) "spring"

3) "java"

127.0.0.1:6379> scard set1

(integer) 3

127.0.0.1:6379> srem set1 spring

(integer) 1

127.0.0.1:6379> sismember set1 spring

(integer) 0

127.0.0.1:6379> smembers set1

1) "redis"

2) "java"

127.0.0.1:6379> sadd set1 mysql spring

(integer) 2

127.0.0.1:6379> spop set1

"redis"

127.0.0.1:6379> smembers set1

1) "mysql"

2) "spring"

3) "java"

127.0.0.1:6379>

下面是一些用于处理多个集合的一些命令

sdiff key [key...] 返回存在于第一个集合,但不存在于其他集合中的元素(数学上的差集运算)

sinter key [key...] 返回同时存在于所有集合中的元素(数学上的交集运算)

sunion key [key...] 返回至少存在于一个集合中的元素(数学上的并集运算)

127.0.0.1:6379> smembers set1

1) "mysql"

2) "spring"

3) "java"

127.0.0.1:6379> smembers set2

1) "mysql"

2) "springboot"

3) "redis"

127.0.0.1:6379> sdiff set1 set2

1) "java"

2) "spring"

127.0.0.1:6379> sinter set1 set2

1) "mysql"

127.0.0.1:6379> sunion set1 set2

1) "mysql"

2) "springboot"

3) "java"

4) "spring"

5) "redis"

127.0.0.1:6379>

hash | 散列表(哈希表)

Redis的hash类型其实就是一个缩减版的redis。它存储的是键值对,将多个键值对存储到一个redis键里面。

底层实现概述

hash类型的底层主要也是基于字典这种数据结构来实现的。

434c68424e3aaff0bb945886b0628733.png

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 123@123 year 12

OK

127.0.0.1:6379> hmget hash1 email

1) "123@123"

127.0.0.1:6379> hlen hash1

(integer) 3

127.0.0.1:6379> hdel hash1 year

(integer) 1

127.0.0.1:6379> hexists hash1 year

(integer) 0

127.0.0.1:6379> hkeys hash1

1) "username"

2) "email"

127.0.0.1:6379> hvals hash1

1) "tom"

2) "123@123"

127.0.0.1:6379> hgetall hash1

1) "username"

2) "tom"

3) "email"

4) "123@123"

127.0.0.1:6379>

zset | 有序集合

有序集合相比较于集合,多个有序两个字,我们知道set集合类型存储的元素是无序的,那Redis有序集合是怎么保证有序的?使用分值,有序集合里存储这成员与分值之间的映射,并提供了分值处理命令,以及根据分值的大小有序地获取成员或分值的命令。

底层实现概述

Redis有序集合的实现使用了一种叫跳跃表的数据结构(简称跳表,可自行查阅),同时也使用到了前面提到的压缩列表。也是满足一定条件的话,会自行转换。

cea6f8cf6c70e580aa33df3dca96cfd5.png

有序集合操作命令详解

zadd z-key score memer [score member...] 将带有给定分值的成员添加到有序集合里面

zrem z-key member [member...] 从有序集合里面移除给定的成员,并返回被移除成员的数量

zcard z-key 返回有序集合包含的成员数量

zincrby z-key increment member 将member成员的分值加上increment

zcount 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) 5

127.0.0.1:6379> zcard zset1

(integer) 5

127.0.0.1:6379> zcount zset1 2 10

(integer) 2

127.0.0.1:6379> zrank zset1 d

(integer) 1

127.0.0.1:6379> zscore zset1 e

"20"

127.0.0.1:6379> zrange zset1 3 5

1) "b"

2) "e"

127.0.0.1:6379> zrevrank zset1 d

(integer) 3

127.0.0.1:6379> zrevrange zset1 3 5

1) "d"

2) "c"

127.0.0.1:6379> zrangebyscore zset1 5 10

1) "a"

127.0.0.1:6379>

作者Info:

公众号:二营长的笔记

闲话:用技术筑起自己的风墙,当外面的枪林弹雨来临的时候,至少可以来个“面对疾风吧!!!”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 线程 单例_多线程单例模式

多线程单例模式原文:https://blog.csdn.net/u011726005/article/details/823565381. 饿汉模式使用饿汉模式实现单例是十分简单的,并且有效避免了线程安全问题,因为将该单例对象定义为static变量,程序启动即将其构造完成了。代码实…

java 中间件 pdf_Java中间件技术及其应用开发 PDF扫描版[51MB]

Java中间件技术及其应用开发 内容提要:本书使用丰富的案例介绍了使用Java技术进行中间件编程的方法及技巧,包括JSP、JavaServlet、JDBC数据库开发、使用JavaMail开发邮件应用程序、RMI(远程方法调用)、EnterpriseJavaBeans开发、使用CORBA以及JavaIDL进行…

java循环左一_左旋转字符串(Java)-循环Index方式

左旋转字符串(Java)-循环Index方式题目要求​ 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S”…

java车次信息_从火车站车次公示栏来学Java读写锁

Java多线程并发之读写锁本文主要内容:读写锁的理论;通过生活中例子来理解读写锁;读写锁的代码演示;读写锁总结。通过理论(总结)-例子-代码-然后再次总结,这四个步骤来让大家对读写锁的深刻理解。本篇是《凯哥(凯哥Java…

java构建xml参数_Java中使用XML创建EMAIL模板

邮件模板让我们来看看邮件模板的格式。模板是XML文件,它包含一个根元素和一系列根的子元素。根元素是。必要的子元素是, , 和 。可选的子元素是 , , 和 。如果你使用过邮件系统,那么你可以推导出这些元素实际包含的内容。可选的元素有多个实例&#xff0…

java 多目录 编译jar_javac编译多个包下的、依赖其他jar包的java文件

问题:多个*.java文件编译*.java文件依赖其他的jar包如下文件结构:F:\jar_prachild--child01--MyChild.java--child02--MyChild.javaparent--MyParent.javaMyParent.javapackage parent;public class MyParent{public void show(){System.out.println(&qu…

java11创建项目_2019-04-11 使用IDEA创建SpringBoot项目

一. 使用IDEA新建项目根据需要选择starter这样使用IDEA搭建的一个SpringBoot项目就可以了。同样可以通过https://start.spring.io/构建。二. 结构分析1.Springboot01Application:运行Springboot01Application就可以启动Spring Boot工程。2. pom.xml中则配置好了选中的starter的…

微博php sdk,php sdk微博第三方授权登入简单使用

简单说一下OAuth协议:OAUTH是一种开放的协议,为桌面、手机或web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务。下面我们去微博开发者平台登入微博。如图填写信息:网站接入->创建新应用填写信息后可以拿到微博给…

php 堵塞 消息队列,PHP的并发处理

PHP如何处理并发什么是进程、线程、协程进程 Process计算机中的程序关于某数据集合上的一次运行活动,“一个执行中的程序”系统进行资源分配和调度的基本单位三态模型:多道程序系统中,进程在处理器上交替运行,状态不断地发生变化运…

python执行文件函数,python如何运行函数

运行Python的函数,只需要调用函数名,在传递参数就可以,不必关心函数体内部的代码块。函数是带名字的代码块,用于完成具体的工作需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调…

php小白书,php小白的自学第一天

虽然我还没有学会Python,但是已经开学了……然后老师要验收以php编写的网页……(wdnmd )这两天先把这个网页设计处理了,Python也会学,Linux还没开始,web更是啥也不会……谁再和我说大学比高中轻松我跟他拼命(听说只要先熟悉了HTML…

linux配置文件为yum,yum的配置文件说明

1、网上的可供yum的链接,要求里面有repodata目录,该目录就是分析 RPM 软体后所产生的软体属性相依资料放置处。2、配置文件:/etc/yum.repos.d/CentOS-Base.repo,也可以此目录下建别的以.repo后缀的文件就行[base]:代表…

linux操作系统权限详解,Linux权限详解

权限权限是操作系统用来限制对资源访问的机制。权限一般分为读、写、执行。每个用户都有特定的权限、所属用户、所属组,通过这样的机制来限制哪些用户、哪些组可以对待特定的文件进行怎么样的操作。每个进程都是以某个用户的身份运行,所以进程的权限与该…

Linux 内核 颜色,Linux操作系统内核版的表示方法是( )

(8分)将煤粉隔绝空气加强热,除主要得到焦炭外,还能得到下表所列的物质:序号①②③④⑤⑥⑦名称甲烷一氧化碳乙烯苯在家庭中进行的下列实验或做法可行的是()A.用食醋区分食盐和纯碱B.将食盐经溶解、过滤、蒸发来制纯净的…

linux上听FM程序,安装和使用Odio在Linux上收听FM收音机的方法

Linux平台上有一些很棒的无线电应用程序可用于在Linux上收听FM Radio(收音机),本文介绍Odio,包括安装和使用它来收听FM收音机的方法。启用S​​nap支持和安装Odio由于Snap软件包,Odio无线电应用在Linux上得到了支持,在Linux上&…

go linux 源码编译环境,修改并编译golang源码

Go 语言诞生5周年!友情提示:本文使用Markdown编写,黑色背景文字可能需要横向拖动才能看清全文最近为了做Hyperledger Fabric国密改造,涉及到了golang源码的改动。特将操作过程整理如下,以供参考:golang的源…

linux如何用cat看一行数据库,linux的cat命令

linux下cat命令最基本的用法是用来查看文件内容。那么它的其他用法是什么呢?下面由学习啦小编为大家整理了linux的cat命令的相关知识,希望大家喜欢!linux的cat命令用法1:查看文件内容主要用法1、cat f1.txt,查看f1.txt文件的内容。2、cat -n f1.txt&…

linux 内核空间 sy,在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysf...

级别: 初级燚 杨 (), 计算机科学硕士2006 年 2 月 16 日本系列文章包括两篇,它们文详细地介绍了 Linux 系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、deb…

linux 计划任务格式,linux crontab 定时任务格式和使用方法2019-01-13

前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划…

c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...

数据结构(C语言版)——有序表查找(折半查找)(代码版)数据结构(C语言版)——有序表查找(折半查找)(代码版)#include #include #define ERROR 0#define OK 1#define MAXSIZE 20typedef int Status;Status binarySearch(int arr[],int arrLenght,int wantSearchElement);int main(…