01-Redis基础和String数据类型

01、Redis的启动

【1】、后台启动

1、修改配置文件redis.conf

daemonize yes

bind 0.0.0.0

2、启动redis

./redis-server /usr/local/soft/redis-5.0.5/redis.conf

【2】、基本操作

redis默认有16个库(0~15),默认使用第一个db0。

databases 16

1、切换数据库

select 0

2、清空当前数据库

flush db

02、基本数据类型

String、Hash、Set、List、Zset、Hyperloglog、Geo、Streams

03、SDS(Simple Dynamic String   简单动态字符串)

【1】、什么是SDS?

Redis中字符串的实现。SDS又有多种结构(sds.h):sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64,用于存储不同的长度的字符串。分别代表2^5=32byte,2^8=256byte,2^16=65536byte=64KB,2^32byte=4GB。

01-Redis基础和String数据类型

【2】、为什么Redis要用SDS实现字符串

C语言本身没有字符串类型,只能用字符数组char[ ]实现。但是数组char[ ]用在redis上存在一些缺点

1、使用字符数组必须先给目标变量分配足够的空间,否则可能会溢出。

2、如果要获取字符长度,必须遍历字符数组,时间复杂度是O(n)。

3、C字符串长度的变更会对字符数组做内存重分配。

【3】、SDS的特点

1、不用担心内存溢出问题,如果需要会对SDS进行扩容。

2、获取字符串长度时间复杂度为O(1),因为定义了len属性。

3、通过“空间预分配”(sdsMakeRoomFor)和“惰性空间释放”,防止多次重分配内存。

【4】、embstr编码方式和raw编码方式的区别?

一个字符串值的长度小于等于44字节,则按照embstr进行编码,否则按照raw进行编码。

1、embstr的使用只分配一次内存空间(因为RedisObject和SDS是连续的),而raw需要分配两次内存空间(分别为RedisObject和SDS分配空间)。

2、embstr的好处在于创建时少分配一次空间,删除时少释放一次空间,以及对象的所有数据连在一起,寻找方便。

【5】、int和embstr什么时候转化为raw?

int数据不再是整数,或大小超过了long的范围。

【6】、明明没有超过阈值,为什么变成raw了?

修改embstr对象,修改后的对象一定是raw的,无论是否达到了44个字节。

【7】、当长度小于阈值时,会还原吗?

编码转换在Redis写入数据时完成,且转换过程不可逆

【8】、封装的作用

通过封装,可以根据对象的类型动态地选择存储结构和可以使用的命令,实现节省空间和优化查询速度。

04、String字符串

【1】、操作命令

1、设置多个值

mset key1 value1 key2 value2

2、判断key是否存在

setnx key1

3、保持原子性、保持释放锁失败的补充性,可多参数

set key1 value1 ex 10 nx

4、值递增

incr key1

incrby key 100

5、值递减

decr key1

decrby key1 100

6、浮点数增加

set f 2.5

incrbyfloat f 7.3

7、获取多个值

mget key1 key2

8、获取长度

strlen key1

9、字符串追加内容

append key1 value2

10、获取指定范围的字符串

getrange key1 0 8

【2】、数据模型

Redis是KV的数据库,它是通过hashtable实现的。每个键值对都会有一个dictEntry。其中里面指向了key和value的指针,next指向下一个dictEntry。

01-Redis基础和String数据类型

01-Redis基础和String数据类型

【3】、redisObject

redisObject定义在src/server.h文件中

01-Redis基础和String数据类型

可以使用type命令来查看对外的类型。

type key1

string

【4】、内部编码

01-Redis基础和String数据类型

01-Redis基础和String数据类型

【5】、字符串类型的内部编码有三种?

1、int,存储8个字节的长整型(long,2^63-1)。

2、embstr,代表embstr格式的SDS(SimpleDynamicString简单动态字符串),存储小于44个字节的字符串。

3、raw,存储大于44个字节的字符串(3.2版本之前是39字节)

【6】、应用场景

1、缓存

2、数据共享分布式

01-Redis基础和String数据类型

3、分布式锁 

4、全局ID

5、限流

INT类型,INCR方法。以访问者的IP和其他信息作为key,访问一次增加一次计数,超过次数则返回false。

6、位统计【重点】

字符是以8位二进制存储的。

01-Redis基础和String数据类型

例如:在线用户统计,留存用户统计

Redis 统计7天连续在线用户人数

http://www.321332211.com/thread?topicId=224