首页 > 数据库 >Redis基础

Redis基础

时间:2022-10-28 13:04:44浏览次数:47  
标签:city 127.0 0.1 Redis 基础 6379 china


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


标签:city,127.0,0.1,Redis,基础,6379,china
From: https://blog.51cto.com/u_15850876/5804532

相关文章

  • Java基础概论
    Java代码编译器.class文件字节码Jvm可处理的jvmjvm处理(执行引擎)机器可执行的程序运行switchjava5之后枚举7stringlong目前都不行左移三位this自身的一个对......
  • Redis的五大数据类型的底层实现
    Redis的五大数据类型的底层实现redis是以键值对储存数据的,所以对象又分为对象喝键值对象即,存储一个key-value键值对会创建两个对象,键对象和值对象。对象可以是5大对象中......
  • javaSE02基础语法
    java基础语法IDE的使用IDE(IntegratedDevelopmentEnvironment)集成开发环境包含编辑器,编译器,调试图形界面IntelliJIDEA捷克的一家公司收费的EclipseIBM公司开发的......
  • javaSE06基础-对象与引用-基本类型和引用类型的区别
    面向对象2对象与引用引用对象:Java语言中除基本数据类型之外的变量类型都称为引用类型.java中的对象是通过引用对其操作的例如:我们有一个自定义类为Car(汽车类)classCar{S......
  • javaSE09基础-面向对象三大特征
    面向对象特征封装封装概念:封装,将类的某些信息隐藏在类内部,不允许外部访问,而且时通过该类提供的方法来实现对隐藏信息的操作和访问优点:隐藏类的实现细节类内部的结构可......
  • java基础-->常用API之Scanner键盘录入
    Scanner类概述C++中有cin,scanf用来读取键盘中的数据。在java中使用Scanner类中的next方法来获取键盘中的数据。Scanner类的方法可以完成接收键盘录入的数据,接收的数据类......
  • Redis启动命令
     启动redis 打开cmd窗口,执行命令:redis-serverredis.windows.conf......
  • CNN基础论文 精读+复现----LeNet5 (二)
    文章目录​​复现准备​​​​数据部分​​​​搭建网络结构​​​​C1层:​​​​S2层:​​​​C3层:​​​​S4层:​​​​C5层:​​​​F6层:​​​​Output层:​​​​损失......
  • L:python基础知识:数学运算函数,字符串内置函数,math数学模块,random随机模块,datetim
    数学运算函数asb(x)返回绝对值divmod(x,y)返回一个(x//y,x%y)的元组,可以用两个变量来接收它max(seq),min(seq)返回seq序列的最大值,最小值pow(x,y)返回x的y次方round(x,p......
  • redis缓冲区:缓冲区大小可以随意设置吗?
    前言我们都知道缓冲区是为了应对数据传递两端发送和接收速度不一致的方案。但如果缓冲区占用的资源超出设定的上限时,就会出现缓冲区溢出。Redis是典型的客户端-服务端架构,在......