Redis

Reis

Redis 是一个开源的高性能键值存储数据库,它通常被用作数据结构服务器。由于其出色的性能和灵活性,Redis 被广泛应用于缓存、会话管理、消息队列、排行榜、实时分析等场景。

主要特点:

1.数据结构丰富:Redis 不仅支持简单的键值对,还支持多种数据结构,如字符串(Strings)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、哈希表(Hashes)、位图(Bitmaps)、超日志(HyperLogLogs)和地理空间索引(Geospatial Indexes)。

2.内存存储与持久化:Redis 将所有数据保存在内存中,以实现快速的读写访问。同时,它提供了多种持久化选项,包括RDB(Redis Database)快照和AOF(Append Only File)日志,以确保数据的安全性。

3.原子操作:Redis 的所有操作都是原子性的,这意味着它们要么完全执行,要么完全不执行。这使得 Redis 在并发环境下非常可靠。

4.支持发布/订阅模式:Redis 支持发布/订阅消息模式,允许客户端订阅一个或多个频道,并接收发布到这些频道的消息。

5.支持Lua脚本:Redis 支持使用Lua脚本进行复杂的操作,这使得用户可以将多个命令组合成一个原子操作,从而实现更复杂的逻辑。

6.高可用性和分布式:Redis 提供了哨兵(Sentinel)系统和集群(Cluster)模式,以支持高可用性和水平扩展。

应用场景:

  • 缓存系统:由于其高速读写能力,Redis 常被用作缓存解决方案,以减少数据库的访问次数和提高应用性能。
  • 会话存储:Redis 可以用来存储用户会话信息,尤其适用于分布式系统中。
  • 消息队列:Redis 的列表数据结构和发布/订阅机制使其可以作为消息队列系统使用。
  • 实时计数器:例如,用于统计网站访问量、视频播放次数等。
  • 排行榜/领导榜:有序集合数据结构非常适合实现排行榜系统。
  • 地理空间数据处理:Redis 的地理空间索引可以用于存储地理位置信息,并进行各种地理空间查询。

总结:

Redis 是一个功能强大的工具,适用于多种不同的应用场景。它的高性能和丰富的数据结构使其成为开发人员在构建需要快速访问和处理大量数据的应用时的首选。不过,由于它将数据保存在内存中,需要考虑内存成本和数据持久化策略。

下载方式

Linux下载

yum install redis

输入redis-server启动redis服务端

输入redis-cli启动redis客户端

6379是redis默认端口号

redis的数据是以键值对存储 key value

redis是以二进制存储 存中文时 输出的都是十六进制

登陆时 redis-cli --raw展示原始数据 就可以展示中文


基本指令

set key value 设置键值对

get ky 获取值

del key删除值 

exists key 表示值是否存在 (1存在 0不存在)

keys * 查找所有键

keys *me 查找所有以me结尾的键

flushall 删除所有键 慎用

ttl key 显示键过期时间 (-2表示已过期 -1表示没设置过期时间 其余都是还剩多少时间)

expire key 10 设置已经存在的键过期时间为10s

setex key 5 value 设置键值 过期时间为5s

setnx key value 如何key不存在再创建

[root@VM-12-13-centos Redis]# redis-cli --raw
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
zhangsan
127.0.0.1:6379> exists name
1
127.0.0.1:6379> keys *
name
name1
letter
result
geekhour
person
courd
127.0.0.1:6379> keys *me
name
127.0.0.1:6379> del name
1
127.0.0.1:6379> ttl name
-2
127.0.0.1:6379> ttl name1
-1
127.0.0.1:6379> expire name1 10
1
127.0.0.1:6379> ttl name1
6
127.0.0.1:6379> ttl name1
4
127.0.0.1:6379> ttl name1
3
127.0.0.1:6379> setex boot 5 ko
OK
127.0.0.1:6379> ttl boot
2
127.0.0.1:6379> ttl boot
1
127.0.0.1:6379> ttl boot
-2
127.0.0.1:6379> setnx boot ko
1

列表

lpush key a 往头部插入a lpush key a b c 往头部插入a b c

rpush key a 往尾部插入 a rpush key a b c往尾部插入 a b c

lrange key 起始位置 结束位置 (0 -1)查询全部

lpop key 删除头部首元素 lpop key 2删除头部前两个元素

rpop key 删除尾部首元素 rpop key 2删除尾部后两个元素

llen key 查看列表长度

ltrim key 1 3 只保留下标1-3之内的元素,其余均删除

127.0.0.1:6379> lpush letter a b c
5
127.0.0.1:6379> rpush letter a b c
8
127.0.0.1:6379> lrange letter 0 -1
c
b
a
a
b
a
b
c
127.0.0.1:6379> lpop letter 2
c
b
127.0.0.1:6379> rpop letter 2
c
b
127.0.0.1:6379> lrange letter 0 -1
a
a
b
a
127.0.0.1:6379> llen letter
4

集合

sadd key value1 value2... 插入一个集合 集合的值不允许重复

smembers key 查看集合的所有值

sismember key val 查看val是否在集合中

srem key val 删除集合中的val的值

127.0.0.1:6379> sadd has 1 2 3 4 9
5
127.0.0.1:6379> smembers has
1
2
3
4
9
127.0.0.1:6379> sismember has 9
1
127.0.0.1:6379> sismember has 5
0
127.0.0.1:6379> srem has 9
1

有序集合

因为要排序 排序的是key 所以要排序的要放在key位置

zadd key key1 val1 key2 val2 key3 val3

zrange key 0 -1 只显示key

zrange key 0 -1 withscores 显示key和value

zscore key val 显示key

zrank key val1 显示排名位置 从小到大

zrevrank key val1 显示排位位置 从打到小

127.0.0.1:6379> zadd result 680 qinghua 660 beida 650 fudan 640 zheda
4
127.0.0.1:6379> zrange result 0 -1
zheda
fudan
beida
qinghua
127.0.0.1:6379> zrange result 0 -1 withscores
zheda
640
fudan
650
beida
660
qinghua
680
127.0.0.1:6379> zrank result fudan
1
127.0.0.1:6379> zrevrank result fudan
2

哈希

hset 哈希名 key val

hget 哈希名 key 获取哈希的值

hgetall 哈希名 获取哈希的所有键值对

hdel 哈希名 key 删除键值对

hexists 哈希名 key 判断键值对是否存在 (1存在 0不存在)

hkeys 哈希名 获取所有键

hlen 哈希名 获取键值对的数量

127.0.0.1:6379> hset person name zhangsan
1
127.0.0.1:6379> hget person name
zhangsan
127.0.0.1:6379> hgetall person
name
zhangsan
127.0.0.1:6379> hexists person name
1
127.0.0.1:6379> hkeys person
name
127.0.0.1:6379> hlen person
1
127.0.0.1:6379> hdel person name
1

发布订阅功能

subscribe geekhour 订阅名为geekhour的频道

publish geekhour mes 发布geekhour频道的mes消息

缺点 消息无法持久化,消息没用历史记录

消息队列

名称 自动生成唯一消息id 键值对

xadd geekhour * course redis

xlen geekhour 消息的数量

xrange geekhour - + 显示所有消息内容

xdel geekhour 消息id 删除消息

xtrim geekhour maxlen 0 删除所有消息

xread count 2 block 1000 streams geekhour 0 一次读取两条 如果没有就阻塞1秒 在geekhour读 从第0条开始读

如果 0这里大于消息队列内的消息 就会阻塞一秒后退出 如果换成$ 就会从现在开始阻塞等待新的消息

xgroup create geekhour group1 0 创建一个id为0 名字为group1的消费者组

xinfo groups geekhour 查看消费者组信息

消息队列名 消费者组名 消费者

xgroup createconsumer geekhour group1 consumer1 添加消费者

消费者组 消费者 消息队列名 从现在开始读取最新消息

xreadgroup group group1 consumer1 count 2 block 3000 streams geekhour >

127.0.0.1:6379> xadd geekhour * course redis
1726031344197-0
127.0.0.1:6379> xlen geekhour
1
127.0.0.1:6379> xrange geekhour - +
1726031344197-0
course
redis
127.0.0.1:6379> xadd geekhour * age 18
1726031404455-0
127.0.0.1:6379> xlen geekhour
2
127.0.0.1:6379> xrange geekhour - +
1726031344197-0
course
redis
1726031404455-0
age
18
127.0.0.1:6379> xdel geekhour 1726031404455-0
1
127.0.0.1:6379> xrange geekhour - +
1726031344197-0
course
redis
127.0.0.1:6379> xadd geekhour * name zhangsan
1726031483285-0
127.0.0.1:6379> xadd geekhour * age 18
1726031492794-0
127.0.0.1:6379> xread count 2 block 1000 streams geekhour 0
geekhour
1726031344197-0
course
redis
1726031483285-0
name
zhangsan
127.0.0.1:6379> xgroup create geekhour group1 0
OK
127.0.0.1:6379> xinfo groups geekhour
name
group1
consumers
0
pending
0
last-delivered-id
0-0
entries-read

lag

127.0.0.1:6379> xgroup createconsumer geekhour group1 consumer1
1
127.0.0.1:6379> xreadgroup group group1 consumer1 count 2 block 3000 streams geekhour >
geekhour
1726031344197-0
course
redis
1726031483285-0
name
zhangsan

地理空间

geoadd city 116.405285 39.904989 beijing 添加北京的经纬度

geopos city beijing 查看北京经纬度

geodist city beijing shanghai 查看北京和上海的距离 默认为m 加个km 显示km

geosearch city frommember shanghai byradius 300 km 查看上海半径300km内的城市

127.0.0.1:6379> geoadd city 116.405285 39.904989 beijing
1
127.0.0.1:6379> geopos city beijing
116.40528291463851929
39.9049884229125027
127.0.0.1:6379> geodist city beijing shanghai

127.0.0.1:6379> geoadd city 121.4737 31.2304 shanghai
1
127.0.0.1:6379> geodist city beijing shanghai
1067771.2670
127.0.0.1:6379> geodist city beijing shanghai km
1067.7713
127.0.0.1:6379> geosearch city frommember beijing byradius 300 km
beijing

HyperLogLog

放入1 2 3 4 5 的基数是5 再放入1 2 3 4 5基础还是5

使用的是随机算法 优点是占用内存小,缺点就是会有一定的误差

pfadd key val 添加基数 pfadd key val1 val2 添加多个基数

pfcount key 查看基数个数

pfmerge result key1 key2 把两个key合并到result

127.0.0.1:6379> pfadd nums 1 2 3 4 5 1 2 3 4 5
1
127.0.0.1:6379> pfcount nums
5
127.0.0.1:6379> pfadd nums 6 7 8 9
1
127.0.0.1:6379> pfadd nums2 11 22 33 44
1
127.0.0.1:6379> pfmerge res nums nums2
OK
127.0.0.1:6379> pfcount res
13

位图

位图偏移量只有0 1

setbit key 0 1设置偏移量 在偏移量为0的设置为1

setbit key 1 0设置偏移量 在偏移量为1的设置0

getbit key 0 获取偏移量0的值

getbit key 1 获取偏移量1的值

bitcount key 获取key中有多少个1

bitpos key 0/1 获取key中第一个出现0的位置 或第一个出现1的位置

bitpos key 0/1 start end 获取key中 start到end的位置 第一个出现0/1的位置

127.0.0.1:6379> setbit lens 0 1
0
127.0.0.1:6379> setbit lens 1 0
0
127.0.0.1:6379> getbit lens 0
1
127.0.0.1:6379> getbit lens 1
0
127.0.0.1:6379> bitcount lens
1
127.0.0.1:6379> bitpos lens 0
1
127.0.0.1:6379> bitpos lens 1
0

位域

u8就是8位的无符号整数 #0第一个位置 1表示值

bitfield key set u8 #0 1

get key 获取内存中key

bitfield key get u8 #0 获取值

27.0.0.1:6379> BITFIELD user:1:logins SET u8 0 1
0
127.0.0.1:6379> BITFIELD user:1:logins GET u8 0

事务

redis事务并不是原子性的,并不能保证全部成功

但可以保证三件事

1.在exec命令发送之前,所有命令都会被保存到一个队列缓存起来,并不会立刻执行

2.事务开始执行后,当有一个命令执行失败,其他命令依旧会执行,不会受影响

3.事务开始后,新的命令不会影响到事务内的命令,只有结束后,才会影响

multi开启事务

exec结束事务

显示queued表示命令被添加到队列缓存中

持久化

两种方式 RDB AOF

RDB在指定的时间,将内存的数据快照写入磁盘 RDB更适合用来做备份

手动save把数据写入磁盘 获取besave 创建一个线程写入磁盘 主线程接收命令

AOF执行写命令的时候,不仅把命令写入内存,还会把命令写入一个追加文件 这个文件就是AOF 这个文件存储的就是执行命令的操作 redis重启时,就会重新执行AOF里的操作

开启AOF 在配置文件中把appendonly 改为yes

主从复制

把一台redis服务器的数据复制到另一台redis服务器

主节点和从节点 一个主节点有多个从节点 每个从节点只能有一个主节点

一般主节点负责写操作,从节点负责读操作

主节点发生数据变化时,会通过异步方式将数据发送给从节点,保证数据的统一性

哨兵模式

当一个主节点崩溃, 需要手动把其中一个从节点升级为主节点,再把其他从节点指向新的主节点,不是真正的高可用 ,有没有什么能实现故障转移呢?

哨兵有以一个独立进程运行在redis集群中,监控redis每个节点是否正常

1.通过不断的发送命令检查节点是否运行正常

2.当其中一个节点出问题,就会发布订阅,通知其他节点

3.自动故障转移 当主节点出问题,会把一个从节点升级为主节点,再把其他从节点指向新的主节点

使用vim创建一个sentinel.conf文件 写入以下配置

sentinel monitor 主节点名称 主节点ip 端口号 1 1个哨兵

redis-sentinel 配置文件名字 启动哨兵节点

哨兵本身也是一个进程 自己也会出问题,所以一般会有3个哨兵,3个哨兵会选举一个领导者来监控节点,当领导者出问题,会在选举一个领导者监控节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值