Redis(二)进阶使用

pipeline

nc(netcat)安装

#Ubuntu默认安装netcat-openbsd,如果要使用netcat-traditional必须进行安装及配置
#安装
sudo apt-get -y install netcat-traditional
#配置,选择traditional对应的标号
sudo update-alternatives --config nc
#使用
nc host port
echo -e "set key1 hello\nappend key1 ' world'\nstrlen key1\nget key1" | nc localhost 6379

pub/sub发布订阅

#发布
publish channel message
#订阅
subscribe channel

事务

  • 当redis-server中存在多个事务时,首先发送exec命令的事务先执行
#Mark the start of a transaction block
multi
#Execute all commands issued after MULTI
exec
#Discard all commands issued after MULTI
discard
#Watch the given keys to determine execution of the MULTI/EXEC block
watch key [key ...]

modules

Bloom

通过散列算法将元素映射到字节数组中的点位,当有客户端请求时通过散列算法可以初步判断请求的元素是否存在

#下载布隆过滤器源码
wget https://github.com/RedisBloom/RedisBloom/archive/master.zip
#安装unzip进行解压
sudo apt install unzip
sudo unzip master.zip
#编译
cd ./RedisBloom-master
sudo make
#将编译好的扩展文件复制到redis可执行文件目录下
sudo cp redisbloom.so /usr/local/bin
#启动redis-server
redis-server --loadmodule ./redisbloom.so

使用

#bloom filter
BF.ADD key options
BF.EXISTS key options
#cuckoo filter
CF.ADD key options
...
  • 使用布隆过滤器可以解决缓存穿透的问题

Cuckoo(布谷鸟过滤器)

Counting Bloom

Redis配置

maxmemory

LRU (Least Recently Used)

LFU (Least Frequently Used)

Redis持久化

RDB

不支持拉链,因此需要定期把备份文件拷贝出去

copy on write

redis进行持久化时会通过fork()创建一个子进程并且复制所有元素的指针,当请求对元素进行修改时核心处理进程会将指针指向修改后的值从而保持子进程在持久化时数据不会发生改变

  • 时点性
  • save
  • bgsave
    • fork创建子进程

配置

#save [time(seconds)] [changes]
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/6379

AOF

  • 数据丢失少
  • 体量无限变大

配置

#开启AOF
appendonly yes
appendfilename "appendonly.aof"
#模式
appendfsync always
appendfsync everysec
appendfsync no

#自动触发bgrewriteaof
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

Tips

当使用Java写入文件时调用最后一般会调用flush刷写缓存,在写入文件时Linux会创建一个对应的文件描述符,并开辟对应的buffer,当buffer满了之后才会触发写入磁盘文件的操作,主动调用flush是为了刷写最后写入到buffer空间但是并未占满buffer空间的数据

AOF和RDB文件的构成

当同时开启RDB和AOF时,RDB文件会以REDIS开头表示这是一个混合文件(RDB首先备份某个时点的数据RDB数据以二进制形式保存,而后跟AOF记录后续的操作);当只开启AOF文件时,*n一次操作的指令数,$n表示一个指令的字符数,示例如下:

#使用0号库
*2
$6
select
$1
0
#设置key1的值为hello
*3
$3
set
$4
key1
$5
hello

通过命令触发AOF

#阻塞式写入文件
save
#后台写入
bgsave

Linux管道

#对变量num进行赋值
num=0
#通过(())执行运算
((num++))
echo $num
#num的值是多少?
((num++)) | more
#输出进程pid
echo $$
echo $BASHPID
#管道会开启子进程,一下命令输出的进程pid是主进程还是子进程的pid?
echo $$ | more
echo $BASHPID | more
#结论:$$的优先级高于|
上一篇:go语言---delete


下一篇:Java 中Map接口的详解