欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis基础

程序员文章站 2022-05-21 21:05:02
...

Redis

Redis入门

Redis(Remote Dictionary Server ),即远程字典服务 !

是一个开源的使用ANSI C语言编写.支持网络,可基于内存可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis能干吗?

  1. 内存储存,持久化.内存中是断电即失去,所以说持久化很重要(RDB,AOF)
  2. 效率高,可以用于高速缓存
  3. 发布订阅系统
  4. 地图信息分析
  5. 计时器、计数器(浏览量!)

特性

1、多样的数据类型
2、持久化
3、集群
4、事务

redis基础操作

  • Redis默认安装路径是 /usr/local/bin
  • redis默认不是后台启动的,修改配置文件! daemonize yes
  • 启动redis服务器redis-server 指定的配置文件
  • 使用redis-cli进行连接测试!
  • 查看redis的进程是否开启! os -ef|grep redis
  • 关闭redis服务器 shutdown

性能测试

redis-benchmark 是一个压力测试工具

# 测试:100个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
bilibili

基础知识

redis默认是16个数据库

默认使用的是第0个

可以使用 select 进行切换数据库!

127.0.0.1:6379> select 3 # 切换数据库
OK
127.0.0.1:6379[3]> DBSIZE # 查看DB大小!
(integer) 0

查看所有的key

127.0.0.1:6379[3]> keys * # 查看数据库所有的key
1) "name"

清除当前数据库flushdb

清除全部数据库flushALL

Redis 是单线程的

明白Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据
机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所有就使用了单线程了!
Redis 是C 语言写的,官方提供的数据为 100000+ 的QPS,完全不比同样是使用 key-vale的
Memecache差

Redis 为什么单线程还这么快?

  1. Redis 为什么单线程还这么快?
  2. 核心:redis 是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程
    (CPU上下文会切换:耗时的操作!!!)
    ,对于内存系统来说,如果没有上下文切换效率就是最高 的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!

五大数据类型

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间
件MQ。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合
(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间
(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU
驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过
Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

keys *# 查看所有的key

EXISTS name # 判断当前的key是否存在

move name 1 移除当前的key

EXPIRE name 10 设置key的过期时间,单位是秒

ttl name查看当前key的剩余时间

type name查看当前key的一个类型

string

数据结构是相同的!
String类似的使用场景:value除了是我们的字符串还可以是我们的数字!
计数器
统计多单位的数量
粉丝数
对象缓存存储!

list

他实际上是一个链表,before Node after , left,right 都可以插入值
如果key 不存在,创建新的链表
如果key存在,新增内容

如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~

消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

hash

Map集合,key-map! 时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的
key-vlaue!
hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的
存储,String更加适合字符串存储!

set

微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)

Zset

在set的基础上,增加了一个值 set k1 v1 zset k1 score1 v1

其与的一些API,通过我们的学习吗,你们剩下的如果工作中有需要,这个时候你可以去查查看官方文
档!
案例思路:set 排序 存储班级成绩表,工资表排序!
普通消息,1, 重要消息 2,带权重进行判断!
排行榜应用实现,取Top N 测试!

三种特殊数据类型

Geospatial地理位置

朋友的定位,附近的人,打车距离计算?
Redis的Geo在Redis3.2版本就推出了!这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!

getadd 添加地理位置

getpos: 获取一个位置的定位坐标

getdist: 获取连哥哥坐标的位置

georadius 以给定的维度为中心,找到某一半径内的元素

GEORADIUSBYMEMBER 找出位于指定元素周围的其他元素!

GEOHASH命令- 返回一个或多个位置元素的Geohash表示



GEO底层的实现原理其实就是Zset!我们可以使用Zset命令来操作geo!

示例:

# getadd 添加地理位置

# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!

# 有效的经度从-180度到180度。

# 有效的纬度从-85.05112878度到85.05112878度。

# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。

# 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin (error) ERR invalid longitude,latitude pair 39.900000,116.400000

# 参数 key 值()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4bosxAt-1627537696756)(C:/Users/LENOVO/AppData/Roaming/Typora/typora-user-images/image-20210527153734178.png)]

getpos

127.0.0.1:6379> GEOPOS china:city beijing	# 获取指定的城市的经度和纬度!
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city beijing chongqi 1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"

GEODIST

127.0.0.1:6379> GEODIST china:city beijing shanghai km	# 查看上海到北京的直线距离
"1067.3788"
127.0.0.1:6379> GEODIST china:city beijing chongqi km	# 查看重庆到北京的直线距离
"1464.0708"

georadius 以给定的经纬度为中心, 找出某一半径内的元素

127.0.0.1:6379> GEORADIUS	china:city	110	30	1000 km	# 以110,30 这个经纬度为中心,寻
找方圆1000km内的城市				
1) "chongqi"				
2) "xian"				
3) "shengzhen"				
4) "hangzhou"				
127.0.0.1:6379> GEORADIUS	china:city	110	30	500 km
1) "chongqi"				
2) "xian"				
127.0.0.1:6379> GEORADIUS	china:city	110	30	500 km withdist	# 显示到中间距离的位置
1)1) "chongqi" 2) "341.9374"
2)1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord	# 显示他人的定位信息
1)1) "chongqi"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2)1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1	#
筛选出指定的结果!
1) 1) "chongqi" 2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2
1)1) "chongqi" 
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"

2)1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"

GEORADIUSBYMEMBER # 找出位于指定元素周围的其他元素!

127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1)"beijing"
2)"xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1)"hangzhou"
2)"shanghai"

GEOHASH 命令 - 返回一个或多个位置元素的 Geohash 表示

#   将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city beijing chongqi
1)"wx4fbxxfke0"
2)"wm5xzrybty0"

GEO 底层的实现原理其实就是 Zset!我们可以使用Zset命令来操作geo!

127.0.0.1:6379> ZRANGE china:city 0 -1	# 查看地图中全部的元素
1)"chongqi"
2)"xian"
3)"shengzhen"
4)"hangzhou"
5)"shanghai"
6)"beijing"
127.0.0.1:6379> zrem china:city beijing	# 移除指定元素!
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1)"chongqi"
2)"xian"
3)"shengzhen"
4)"hangzhou"
5)"shanghai"

Hyperloglog 基数统计法

优点:占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的话 Hyperloglog 首选

测试使用

127.0.0.1:6379> PFadd mykey a b c d e f g h i j	# 创建第一组元素 mykey (integer) 1
127.0.0.1:6379> PFCOUNT mykey	# 统计 mykey 元素的基数数量
(integer) 10
127.0.0.1:6379> PFadd mykey2 i j z x c v b n m	# 创建第二组元素 mykey2 (integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2	# 合并两组 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> PFCOUNT mykey3	# 看并集的数量!
(integer) 15

如果允许容错,那么一定可以使用 Hyperloglog !

如果不允许容错,就使用 set 或者自己的数据类型即可!

Bitmap位储存

统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用Bitmaps!

Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!

365 天 = 365 bit 1字节 = 8bit 46 个字节左右

使用bitmap 来记录 周一到周日的打

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s9QxH7NM-1627537696758)(C:/Users/LENOVO/AppData/Roaming/Typora/typora-user-images/image-20210527154913370.png)]

查看某一天是否有打卡!

127.0.0.1:6379> getbit sign 3

(integer) 1

127.0.0.1:6379> getbit sign 6

(integer) 0

统计操作,统计 打卡的天数

127.0.0.1:6379> bitcount sign # 统计这周的打卡记录,就可以看到是否有全勤!(integer) 3