Redis技术专栏

Redis数据类型

2019-06-25  本文已影响0人  huxt

数据结构和内部编码

type命令实际返回的就是当前键的数据结构类型,它们分别是: string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集 合)

每种数据结构都有自己底层的内部编码实现,而且是多种实现, 这样Redis会在合适的场景选择合适的内部编码

可以通过object encoding命令查询内部编码

127.0.0.1:6379> object encoding hello 

"embstr" 

127.0.0.1:6379> object encoding mylist 

"ziplist"

单线程架构

Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库 服务

为什么单线程还能这么快

第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大 约为100纳秒,这是Redis达到每秒万级别访问的重要基础

第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上 Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不 在网络I/O上浪费过多的时间

第三,单线程避免了线程切换和竞态产生的消耗。

但是单线程会有一个问题:对于每个命令的执行时间是有要求的。如果 某个命令执行过长,会造成其他命令的阻塞,对于Redis这种高性能的服务 来说是致命的

字符串

字符串类型的值实际可以 是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能 超过512MB。

1.常用命令

set key value [ex seconds] [px milliseconds] [nx|xx]

set命令有几个选项:

·ex seconds:为键设置秒级过期时间。

·px milliseconds:为键设置毫秒级过期时间。

·nx:键必须不存在,才可以设置成功,用于添加。

·xx:与nx相反,键必须存在,才可以设置成功,用于更新。

除了set选项,Redis还提供了setex和setnx两个命令:

setex key seconds value 

setnx key value

setnx和setxx在实际使用中有什么应用场景吗?以setnx命令为例子,由于 Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value, 根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种 实现方案,Redis官方给出了使用setnx实现分布式锁的方

获取值

get key

批量设置值

mset key value [key value ...]

127.0.0.1:6379> mset a 1 b 2 c 3 d 4 

OK

批量获取值

mget a b c d

如果有些键不存在,那么它的值为nil(空),结果是按照传入键的顺

Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络 时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执 行1000次get命令和1次mget命令的区别如表2-1,因为Redis的处理能力已经足够高,对于开发人员来说,网络可能会成为性能的瓶颈

学会使用批量操作,有助于提高业务处理效率,但是要注意的是每次批 量操作所发送的命令数不是无节制的,如果数量过多可能造成Redis阻塞或者网络拥塞。

计数

incr key

incr命令用于对值做自增操作,返回结果分为三种情况:

·值不是整数,返回错误。

·值是整数,返回自增后的结果。

·键不存在,按照值为0自增,返回结果为1。

127.0.0.1:6379> exists key 

(integer) 0 

127.0.0.1:6379> incr key

 (integer) 1

再次对键执行incr命令,返回结果是2:

127.0.0.1:6379> incr key 

(integer) 2

除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、 decrby(自减指定数字)、incrbyfloat(自增浮点数)

追加值

append key value

append可以向字符串尾部追加值,

127.0.0.1:6379> get key 

"redis" 

127.0.0.1:6379> append key world 

(integer) 10 

127.0.0.1:6379> get key 

"redisworld"

字符串长度

127.0.0.1:6379> strlen key 

(integer) 10

每个中文占用3个字节

127.0.0.1:6379> set hello "世界" 

OK 

127.0.0.1:6379> strlen hello 

(integer) 6

设置并返回原值

127.0.0.1:6379> getset hello world 

(nil) 

127.0.0.1:6379> getset hello redis 

"world"

设置指定位置的字符

下面操作将值由pest变为了best:

127.0.0.1:6379> set redis pest 

OK 

127.0.0.1:6379> setrange redis 0 b 

(integer) 4 

127.0.0.1:6379> get redis "best"

获取部分字符串

getrange key start end

start和end分别是开始和结束的偏移量,偏移量从0开始计算

127.0.0.1:6379> getrange redis 0 1 

"be"

内部编码

字符串类型的内部编码有3种:

·int:8个字节的长整型。

·embstr:小于等于39个字节的字符串。

·raw:大于39个字节的字符串。

Redis会根据当前值的类型和长度决定使用哪种内部编码实现

127.0.0.1:6379> set key 8653 

OK 1

27.0.0.1:6379> object encoding key 

"int"

#小于等于39个字节的字符串:embstr 

127.0.0.1:6379> set key "hello,world" 

OK 

127.0.0.1:6379> object encoding key 

"embstr"

上一篇下一篇

猜你喜欢

热点阅读