分布式键值系统redis思考一

“Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.” —— Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。(摘自官网)
好,逼装完了,我们依然像之前分析mysql一样先从底层说起,那么redis的底层的数据结构是怎样的呢。

未安装redis的可以参照
https://blog.csdn.net/xk4848123/article/details/105315869

redis数据结构

Redis 有 5 种基础数据结构,它们分别是:string(字符串)、list(列表)、hash(字典)、set(集合) 和 zset(有序集合)。这 5 种是 Redis 相关知识中最基础、最重要的部分,下面我们结合源码以及一些实践来给大家分别讲解一下。
在这里插入图片描述

数据结构操作演示

1.字符串string

redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。

127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> get counter
(nil)
127.0.0.1:6379> set counter 1
OK
127.0.0.1:6379> INCRBY counter
(error) ERR wrong number of arguments for 'incrby' command
127.0.0.1:6379> INCRBY counter 1
(integer) 2
127.0.0.1:6379> INCR counter 1
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> INCR counter
(integer) 3

分布式场景中可以用incr来作计数器,因为redis网络处理是单线程的。

2.列表list

127.0.0.1:6379> LPUSH list 1
(integer) 1
127.0.0.1:6379> RPUSH list 2
(integer) 2
127.0.0.1:6379> LPOP list
"1"
127.0.0.1:6379> LPOP list
"2"
127.0.0.1:6379> 
127.0.0.1:6379> LPUSH list a
(integer) 1
127.0.0.1:6379> LPUSH list b
(integer) 2
127.0.0.1:6379> LPUSH list last
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "last"
2) "b"
3) "a"
127.0.0.1:6379> 

1.LPUSH,RPUSH分别是从头入队、从尾入队

2.LPOP,RPOP分别是从头出队、从尾出队

3.LRANGE 范围

3.哈希

127.0.0.1:6379> HSET books java "think in java"
(integer) 1
127.0.0.1:6379> HSET books python "python cookbook"
(integer) 1
127.0.0.1:6379> HGETALL books
1) "java"
2) "think in java"
3) "python"
4) "python cookbook"
127.0.0.1:6379> 
127.0.0.1:6379> HGET books java
"think in java"
127.0.0.1:6379> HSET books java "head first java"
(integer) 0
127.0.0.1:6379> HGETALL books
1) "java"
2) "head first java"
3) "python"
4) "python cookbook"
127.0.0.1:6379> HMSET books java "effetive  java" python "learning python"
OK

4.set集合(无序去重)

127.0.0.1:6379> SADD books1 python
(integer) 1
127.0.0.1:6379> SADD books1 java
(integer) 1
127.0.0.1:6379> SADD books1 java
(integer) 0
127.0.0.1:6379> SADD books1 golang
(integer) 1
127.0.0.1:6379> SMEMBERS books1
1) "golang"
2) "java"
3) "python"
127.0.0.1:6379> SCARD books1
(integer) 3
127.0.0.1:6379> SPOP books1
"golang"

5.有序列表 zset

127.0.0.1:6379> ZADD books2 1586098912 "task1"
(integer) 1
127.0.0.1:6379> ZADD books2 1586099912 "task2"
(integer) 1
127.0.0.1:6379> ZADD books2 1586109912 "task3"
(integer) 1
127.0.0.1:6379> ZRANGE books2 0 1
1) "task1"
2) "task2"
127.0.0.1:6379> ZADD books2 1586097912 "task4"
(integer) 1
127.0.0.1:6379> ZRANGE books2 0 1
1) "task4"
2) "task1"
127.0.0.1:6379> ZRANGE books2 0 -1
1) "task4"
2) "task1"
3) "task2"
4) "task3"
127.0.0.1:6379> ZRVRANGE books2 0 -1
(error) ERR unknown command `ZRVRANGE`, with args beginning with: `books2`, `0`, `-1`, 
127.0.0.1:6379> ZREVRANGE books2 0 -1
1) "task3"
2) "task2"
3) "task1"
4) "task4"
127.0.0.1:6379> ZCARD books2
(integer) 4

ZRANGEBYSCORE命令可以用来实现延时队列,这时score记未来想要执行的某个时间戳。

6. 布隆过滤器

在https://github.com/RedisBloom/RedisBloom下载最新的release源码,在编译服务器进行解压编译:

tar zxvf RedisBloom-2.2.2.tar.gz
cd RedisBloom-2.2.2
make
cp ./redisbloom.so /usr/local/redis/src/

关闭redis-server

127.0.0.1:6379> shutdown
not connected> exit
[root@localhost bin]# ps -ef|grep redis
root       8097   6020  0 08:17 pts/0    00:00:00 grep --color=auto redis

重启redis,指定了默认的容量与容错率

./redis-server /usr/local/redis/conf/redis.conf --loadmodule /usr/local/redis/src/rebloom.so INITIAL_SIZE 10000000 ERROR_RATE 0.0001
127.0.0.1:6379> BF.MADD test user2 user2
1) (integer) 1
2) (integer) 0
127.0.0.1:6379> BF.MADD test user2 user3
1) (integer) 0
2) (integer) 1
127.0.0.1:6379> BF.MADD test user4 user5
1) (integer) 1
2) (integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> BF.EXISTS test user1
(integer) 1
127.0.0.1:6379> BF.EXISTS test user6
(integer) 0
127.0.0.1:6379> BF.MEXISTS test user1 user6
1) (integer) 1
2) (integer) 0

1,BF.ADD {key} {item}
单条添加元素
向Bloom filter添加一个元素,如果该key不存在,则创建该key(过滤器)。
如果项是新插入的,则为“1”;如果项以前可能存在,则为“0”。

2,BF.MADD {key} {item} [item…]
批量添加元素
布尔数(整数)的数组。返回值为0或1的范围的数据,这取决于是否将相应的输入元素新添加到过滤器中,或者是否已经存在。

3,BF.EXISTS {key} {item}
判断单个元素是否存在
如果存在,返回1,否则返回0

4,BF.MEXISTS {key} {item} [item…]
判断多个元素是否存在
布尔数(整数)的数组。返回值为0或1的范围的数据,这取决于是否将相应的元是否已经存在于key中。

7.HyperLogLog计算基数

127.0.0.1:6379> PFADD hyperloglog a
(integer) 1
127.0.0.1:6379> PFADD hyperloglog b
(integer) 1
127.0.0.1:6379> PFADD hyperloglog c
(integer) 1
127.0.0.1:6379> PFADD hyperloglog b
(integer) 0
127.0.0.1:6379> PFADD hyperloglog c
(integer) 0
127.0.0.1:6379> PFCOUNT hyperloglog
(integer) 3
127.0.0.1:6379> PFADD hyperloglog1 d
(integer) 1
127.0.0.1:6379> PFADD hyperloglog1 c
(integer) 1
127.0.0.1:6379> PFMERGE hyper hyperloglog hyperloglog1
OK
127.0.0.1:6379> PFCOUNT hyper
(integer) 4

PFADD (新增操) 丶PFCOUNT( 计算基数,就是几个不重复的元素)丶PFMERGE(合并)等操作

redis数据结构底层知识(未完待续)

发布了14 篇原创文章 · 获赞 83 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xk4848123/article/details/105318725
今日推荐