Redis详解_redis h'ke'y-程序员宅基地

技术标签: 工具  redis  

Nosql 概述

1、单机MySQL的年代!

在这里插入图片描述
DAL: 数据库访问层

90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!

那个时候,更多的去使用静态网页 Html ~ 服务器根本没有太大的压力!

思考一下,这种情况下:整个网站的瓶颈是什么?

1、数据量如果太大、一个机器放不下了!
2、数据的索引 (B+ Tree),一个机器内存也放不下
3、访问量(读写混合),一个服务器承受不了~

只要你开始出现以上的三种情况之一,那么你就必须要晋级!

2、Memcached(缓存) + MySQL + 垂直拆分 (读写分离)

网站80%的情况都是在读,每次都要去查询数据库的话就十分的麻烦!所以说我们希望减轻数据的压力,我们可以使用缓存来保证效率!

发展过程: 优化数据结构和索引–> 文件缓存(IO)—> Memcached(当时最热门的技术!)
在这里插入图片描述

3、分库分表 + 水平拆分 + MySQL集群

技术和业务在发展的同时,对人的要求也越来越高!

本质:数据库(读,写)

早些年MyISAM: 表锁,十分影响效率!高并发下就会出现严重的锁问题
转战Innodb:行锁

慢慢的就开始使用分库分表来解决写的压力! MySQL 在哪个年代推出 了表分区!这个并没有多少公司使用!

MySQL 的 集群,很好满足哪个年代的所有需求!
在这里插入图片描述

4、如今最近的年代

2010–2020 十年之间,世界已经发生了翻天覆地的变化;(定位,也是一种数据,音乐,热榜!)
MySQL 等关系型数据库就不够用了!数据量很多,变化很快~!

MySQL 有的使用它来村粗一些比较大的文件,博客,图片!数据库表很大,效率就低了!如果有一种数据库来专门处理这种数据,

MySQL压力就变得十分小(研究如何处理这些问题!)大数据的IO压力下,表几乎没法更大!

目前一个基本的互联网项目!

在这里插入图片描述

为什么要用NoSQL!

用户的个人信息,社交网络,地理位置。用户自己产生的数据,用户日志等等爆发式增长!

这时候我们就需要使用NoSQL数据库的,Nosql 可以很好的处理以上的情况!

NoSQL

NoSQL = Not Only SQL (不仅仅是SQL)

关系型数据库:表格 ,行 ,列

泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其
是超大规模的高并发的社区! 暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!

很多的数据类型用户的个人信息,社交网络,地理位置。这些数据类型的存储不需要一个固定的格式!

不需要多月的操作就可以横向扩展的 ! Map<String,Object> 使用键值对来控制!

NoSQL 特点

解耦!
1、方便扩展(数据之间没有关系,很好扩展!)
2、大数据量高性能(Redis 一秒写8万次,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)
3、数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人就无法设计了!)
4、传统 RDBMS 和 NoSQL

传统的 RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独的表中 row col
- 操作操作,数据定义语言
- 严格的一致性
- 基础的事务
- .....
Nosql
- 不仅仅是数据
- 没有固定的查询语言
- 键值对存储,列存储,文档存储,图形数据库(社交关系)
- 最终一致性,
- CAP定理和BASE (异地多活) 初级架构师!(狂神理念:只要学不死,就往死里学!)
- 高性能,高可用,高可扩
- ....

了解:3V+3高

大数据时代的3V:主要是描述问题的

  1. 海量Volume
  2. 多样Variety
  3. 实时Velocity

大数据时代的3高:主要是对程序的要求

  1. 高并发
  2. 高可扩展(随时水平拆分,机器不够了,可以扩展机器来解决)
  3. 高性能(保证用户体验和性能)

真正在公司中的实践:NoSQL + RDBMS 一起使用才是最强的,阿里巴巴的架构演进!

技术没有高低之分,就看你如何去使用!(提升内功,思维的提高!)

阿里巴巴架构演进

思考问题:这么多东西难道都是在一个数据库中的吗?

技术急不得,越是慢慢学,才能越扎实!

开源才是技术的王道!

任何一家互联网的公司,都不可能只是简简单单让用户能用就好了!
大量公司做的都是相同的业务;(竞品协议)

随着这样的竞争,业务是越来越完善,然后对于开发者的要求也是越来越高!

如果你未来相当一个架构师: 没有什么是加一层解决不了的!
在这里插入图片描述
如果你未来相当一个架构师: 没有什么是加一层解决不了的!

# 1、商品的基本信息
	名称、价格、商家信息;
	关系型数据库就可以解决了! MySQL / Oracle (淘宝早年就去IOE了!- 王坚:推荐文章:阿里云的这群疯子:40分钟重要!)
	淘宝内部的 MySQL 不是大家用的 MySQL
	
# 2、商品的描述、评论(文字比较多)
	文档型数据库中,MongoDB
	
# 3、图片
	分布式文件系统 FastDFS
		- 淘宝自己的 TFS
		- Gooale的 GFS
		- Hadoop HDFS
		- 阿里云的 oss

# 4、商品的关键字 (搜索)
	- 搜索引擎 solr elasticsearch
	- ISerach:多隆(多去了解一下这些技术大佬!)
	所有牛逼的人都有一段苦逼的岁月!但是你只要像SB一样的去坚持,终将牛逼!
	
# 5、商品热门的波段信息
	- 内存数据库
	- Redis Tair、Memache...
	
# 6、商品的交易,外部的支付接口
	- 三方应用

要知道,一个简单地网页背后的技术一定不是大家所想的那么简单!

大型互联网应用问题:

  • 数据类型太多了!
  • 数据源繁多,经常重构!
  • 数据要改造,大面积改造?

解决问题:
在这里插入图片描述
在这里插入图片描述

Nosql 数据模型

Nosql 四大分类

KV键值对:

  • 新浪:Redis
  • 美团:Redis + Tair
  • 阿里、百度:Redis + memecache

文档型数据库(bson格式 和json一样):

  • MongoDB (一般必须要掌握)
  • MongoDB 是一个基于分布式文件存储的数据库,C++ 编写,主要用来处理大量的文档!
  • MongoDB 是一个介于关系型数据库和非关系型数据中中间的产品!MongoDB 是非关系型数据库中功能最丰富,最像关系型数据库的!
  • ConthDB

列存储数据库

  • HBase
  • 分布式文件系统

图关系数据库
在这里插入图片描述

  • 他不是存图形,放的是关系,比如:朋友圈社交网络,广告推荐!
  • Neo4j,InfoGrid;

四者对比

在这里插入图片描述

Redis 入门

概述

Redis 是什么?

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

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

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

免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库

Redis 能干嘛?

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

特性

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

Redis 介绍

在这里插入图片描述

1、官网:https://redis.io/
2、中文网:http://www.redis.cn/
3、下载地址:通过官网下载即可!

在这里插入图片描述
注意:Wdinow在 Github上下载(停更很久了!)

Redis推荐都是在Linux服务器上搭建的,我们是基于Linux学习!

Windows安装

1、下载安装包:https://github.com/dmajkic/redis/releases
2、下载完毕得到压缩包:

在这里插入图片描述
3、解压到自己电脑上的环境目录下的就可以的!Redis 十分的小,只有5M
在这里插入图片描述
4、开启Redis,双击运行服务即可!
在这里插入图片描述
5、使用redis客户单来来连接redis
在这里插入图片描述
记住一句话,Window下使用确实简单,但是Redis 推荐我们使用Linux去开发使用!

在这里插入图片描述

Linux安装

1、下载安装包! redis-5.0.8.tar.gz
2、解压Redis的安装包! 程序/opt
在这里插入图片描述
3、进入解压后的文件,可以看到我们redis的配置文件
在这里插入图片描述
4、基本的环境安装

yum install gcc-c++
make
make install

在这里插入图片描述
在这里插入图片描述
5、redis的默认安装路径 /usr/local/bin
在这里插入图片描述

6、将redis配置文件。复制到我们当前目录下
在这里插入图片描述
7、redis默认不是后台启动的,修改配置文件!
在这里插入图片描述
8、启动Redis服务!

在这里插入图片描述
9、使用redis-cli 进行连接测试!
在这里插入图片描述

10、查看redis的进程是否开启!
在这里插入图片描述
11、如何关闭Redis服务呢? shutdown
在这里插入图片描述
12、再次查看进程是否存在
在这里插入图片描述
13、后面我们会使用单机多Redis启动集群测试!

测试性能

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

官方自带的性能测试工具!

redis-benchmark 命令参数!
在这里插入图片描述
我们来简单测试下:

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

在这里插入图片描述
如何查看这些分析呢?
在这里插入图片描述

基础的知识

redis默认有16个数据库
在这里插入图片描述

默认使用的是第0个
可以使用 select 进行切换数据库!

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

在这里插入图片描述

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

清除当前数据库 flushdb
清除全部数据库的内容 FLUSHALL

127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> keys *
(empty list or set)

Redis 是单线程的!

明白Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所有就使用了单线程了!

Redis 是C 语言写的,官方提供的数据为 100000+ 的QPS,完全不比同样是使用 key-vale的
Memecache差!

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

1、误区1:高性能的服务器一定是多线程的?
2、误区2:多线程(CPU上下文会切换!)一定比单线程效率高!

先去CPU>内存>硬盘的速度要有所了解!

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

五大基本数据类型

1)Redis-Key

127.0.0.1:6379> keys * # 查看所有的key
(empty list or set)
127.0.0.1:6379> set name kuangshen # set key
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> EXISTS name # 判断当前的key是否存在
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0
127.0.0.1:6379> move name 1 # 移除当前的key
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name qinjiang
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> clear
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> get name
"qinjiang"
127.0.0.1:6379> EXPIRE name 10 # 设置key的过期时间,单位是秒
(integer) 1
127.0.0.1:6379> ttl name # 查看当前key的剩余时间
(integer) 4
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type name # 查看当前key的一个类型!
string
127.0.0.1:6379> type age
string

2)String

##########################################################################
127.0.0.1:6379> set key1 v1 # 设置值
OK
127.0.0.1:6379> get key1 # 获得值
"v1"
127.0.0.1:6379> keys * # 获得所有的key
1) "key1"
127.0.0.1:6379> EXISTS key1 # 判断某一个key是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello" # 追加字符串,如果当前key不存在,就相当于setkey
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1 # 获取字符串的长度!
(integer) 7
127.0.0.1:6379> APPEND key1 ",kaungshen"
(integer) 17
127.0.0.1:6379> STRLEN key1
(integer) 17
127.0.0.1:6379> get key1
"v1hello,kaungshen"
##########################################################################
# i++
# 步长 i+=
127.0.0.1:6379> set views 0 # 初始浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 自增1 浏览量变为1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views # 自减1 浏览量-1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> INCRBY views 10 # 可以设置步长,指定增量!
(integer) 9
127.0.0.1:6379> INCRBY views 10
(integer) 19
127.0.0.1:6379> DECRBY views 5
(integer) 14
##########################################################################
# 字符串范围 range
127.0.0.1:6379> set key1 "hello,kuangshen" # 设置 key1 的值
OK
127.0.0.1:6379> get key1
"hello,kuangshen"
127.0.0.1:6379> GETRANGE key1 0 3 # 截取字符串 [0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 # 获取全部的字符串 和 get key是一样的
"hello,kuangshen"
# 替换!
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 xx # 替换指定位置开始的字符串!
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
##########################################################################
# setex (set with expire) # 设置过期时间
# setnx (set if not exist) # 不存在在设置 (在分布式锁中会常常使用!)
127.0.0.1:6379> setex key3 30 "hello" # 设置key3 的值为 hello,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 26
127.0.0.1:6379> get key3
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liu_to_liu/article/details/119388374

智能推荐

基于MATLAB的运动物体轨迹跟踪--毕业论文_基于运动轨迹图像处理的应用案例-程序员宅基地

文章浏览阅读750次,点赞23次,收藏20次。摘要视频运动目标检测与跟踪算法是计算机视觉领域的一个核心课题,也是智能视频监控系统的关键底层技术。它融合了图像处理、人工智能等领域的研究成果,已经广泛应用于安保监控、智能武器、视频会议、视频检索等各个领域。因此,检测与跟踪算法研究具有极其重要的理论意义和实用价值。运动目标检测与跟踪涉及到计算机图像处理、视频图像处理、模式识别、以及人工智能等诸多领域,广泛地应用于军事、工业、生活等各个方面。研究内容分为三个方面:图像的预处理、运动目标的检测和运动目标的跟踪。在图像的预处理方面,采用均值滤波,抑制噪声;_基于运动轨迹图像处理的应用案例

深度学习4:机器学习基础_机器学习处理数据冗余的模型有哪些-程序员宅基地

文章浏览阅读340次。之前的三类机器学习问题分别是二分类问题,多分类问题,标量回归问题,这三者都是监督学习的例子,目标是学习训练输入与训练目标之间的关系。机器学习四个分支:监督学习,无监督学习,自监督学习,强化学习分类与回归术语表名称描述样本或输入进入模型的数据点预测或输出从模型出来的结果目标真实值,对于外部数据源,理想情况下,模型应该能够预测出目标预测误差或损失值模型预测与目标之间的距离类别分类问题中供选择的一组标签,例如猫狗分类的猫或狗标签分类问题中类别标注_机器学习处理数据冗余的模型有哪些

Android 自定义DialogFragment全屏靠下显示_dialogfragment如何实现距离activity底部有50p x-程序员宅基地

文章浏览阅读407次。默认DialogFragment是展示在屏幕中间,并且周围有边距,而需求是贴近底部展示,并且距离左右下屏幕边界0距离。2.在onCreateView或者onCreateDialog 写布局。1.在onCreateView增加修改边界代码。3.调用dialogFragment。_dialogfragment如何实现距离activity底部有50p x

DockerCompose 构建dubbo-admin服务_docker-compose 设置dubbo-程序员宅基地

文章浏览阅读553次。准备环境准备好docker 和docker-compose安装gityum install git安装mavenyum install maven配置环境变量vi /etc/profile# set Maven environmentexport MAVEN_HOME=/usr/local/maven/apache-maven-3.5.2export PATH=$MAVEN_H..._docker-compose 设置dubbo

OPCServer:使用KEPServer_kepserver一个或多个功能有时间限制-程序员宅基地

文章浏览阅读1.3w次。实际OPCServer使用(450M,中文,破解时间限制):KEPServer V6,百度网盘,密码: ykj2以下为截图官网下载KEPServerEX注册才能下载软件免费,驱动收费,,每天2小时试用时间版本:KEPServerEX-6.6.350.0,大小484M国内下载慢,FQ下载很快安装过程基本上都是默认下一步选择中文..._kepserver一个或多个功能有时间限制

使用jstack定位程序许久没有反应死锁问题_jstack 没有检测到死锁-程序员宅基地

文章浏览阅读713次。引言这个情况现象的程序运行的时候迟迟没有输出,我们可以怀疑的死锁的问题,但是怎么去定位这个问题呢,我们还是借助jstack来做。jstack 163746这个查看没有太复杂的流程,直接查看堆栈信息最后的一部分就okFound one Java-level deadlock:============================="Thread_02": waiting to l..._jstack 没有检测到死锁

随便推点

乐视奥比中光深度相机在下其官网下载openni配置后运行例子出现 D: 640x400,C: 640x480错误_openni检测不到奥比中光设备-程序员宅基地

文章浏览阅读964次,点赞3次,收藏7次。Error - expect color and depth to be in same resolution: D: 640x400, C: 640x480在奥比中光上下载的最新版的OpenNI版的linux版本中出现Error - expect color and depth to be in same resolution: D: 640x400, C: 640x480 这个错误是因为其O..._openni检测不到奥比中光设备

C语言 openssl库 AES对称加解密 CBC模式 PKCS7Padding填充 256秘钥 带16偏移 base64编解码_c语言实现sm4pkcs7填充-程序员宅基地

文章浏览阅读7.2k次,点赞4次,收藏36次。最近学习对接平台 需要用到 AES BASE64 加密对接接口非常少的资料而且满足不了需要或者有bug,譬如无偏移,base解码超位数输出不正常等最后整理出如标题所示的结果希望能帮助到有需要的朋友 也给自己往后回顾用使用前需要安装openssl库使用方法:<./aes 数据> <例子:./aes test> <注意:有空格会被当成多个参数>功能介..._c语言实现sm4pkcs7填充

Spark-Sql快速入门系列(5) | Hive数据库_df.write-程序员宅基地

文章浏览阅读450次。目录一.hive和spark sql的集成方式(面试可能会问到)二.spark_shell和spark_sql操作spark_shellspark_sql使用hiveserver2 + beeline三.脚本使用spark-sql四.idea中读写Hive数据1.从hive中读数据2.从hive中写数据使用hive的insert语句去写使用df.write.saveAsTable("表名")(常用)使用df.write.insertInto("表名")saveAsTable和insertInto的原理一._df.write

[CISCN 2019 初赛]Love Math(RCE+数学函数白名单+符号黑名单)_lovemath is_nan rce-程序员宅基地

文章浏览阅读1.5k次。源码如下:<?phperror_reporting(0);//听说你很喜欢数学,不知道你是否爱它胜过爱flagif(!isset($_GET['c'])){ show_source(__FILE__);}else{ //例子 c=20-1 $content = $_GET['c']; if (strlen($content) >= 80) { die("太长了不会算"); } $blacklist = [' ', '\t'_lovemath is_nan rce

基于java的人事管理系统(源码+免费+可定制)_hr办公系统源码-程序员宅基地

文章浏览阅读227次。该系统致力于提供全面的人事管理解决方案,包括绩效考核、招聘管理、档案管理、工资管理、考勤管理、培训管理和系统管理等七大模块。系统的最大特色在于强大的权限控制功能,将用户分为管理员、财务专员、人事专员和普通用户等四个角色,确保不同角色的用户拥有适当的系统访问权限。前端采用HTML、CSS、JavaScript技术,后端使用Java语言、Spring框架、MySQL数据库,保障了系统界面的友好性和多种数据操作的高效性。通过本次设计,我们不仅成功实现了系统的基本功能,还提高了团队成员的编程和团队协作能力。未来,我_hr办公系统源码

anaconda 通过pip 安装python psycopg2_anaconda psycopg-程序员宅基地

文章浏览阅读4.2k次。1. 【不能在cmd里install】之前一直在 cmd 里conda install psycopg2 ,pip install psycopg2,虽然提示安装成功,但是import时还是会报错提示包不存在。2. 【在prompt里pip】正确的安装方法是,安装完成 anaconda,进入anaconda prompt,输入命令即可pip install psycopg23._anaconda psycopg