Redis学习

NoSQL

为什么要用NoSQL

早期

90年代,早期一个网站的访问量不会太大,打呢个数据库完全够用,随着用户增多,网站出现了以下问题:
1.数据量大到一定程度,单机数据库无法存放
2.数据的索引(B+Tree),一个机器内存无法存储
3.访问量大之后(读写混合),一台服务器无法承受
Redis学习_第1张图片

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

发展过程:优化数据结构和索引==> 文件缓存(IO)==>Memcached(当时最热门的技术)
Redis学习_第2张图片

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

本质:数据库(读、写)
MyISAM:表锁,十分影响效率,高并发影响效率
InnoDB:行锁,分库分表,解决写压力

近代

技术爆炸
MySQL等关系型数据库就不够用了,数据量大,变化快!
如果有一种数据库专门处理大文件数据,mysql压力就会变小
研究如何处理这些问题,大数据IO压力下,表基本上无法更改 1亿

目前的基本互联网项目

Redis学习_第3张图片

为什么要用NoSQL

用户的个人信息、社交网络、地理位置、用户自己产生的数据、用户日志等爆发时增长。这里就需要使用NoSQL,可以很好的处理以上的情况。

NoSQL是什么

noSQL=not OnlySQL(不仅仅SQL)
泛指非关系型数据库,随着web2.0互联网时代,传统数据库很难对付web2.0时代,尤其是高并发的社区和
关系型数据库:表格,行、列、(POI操作表格)
Redis是发展最快的,必须要掌握的一门技术。

NoSQL特点

1.方便扩展(数据之间没有关系,很好扩展)
2.大数据量高性能(Redis每秒读11万,写8万次)
3.数据类型多样性(不需要事先设计数据库)
4.传统RDBMS和NoSQL

传统RDBMS:结构化组织、SQL、数据和关系都单独存储在表中row和col,操作数据,数据定义语言、严格一致性、基础事务
NoSQL:不仅仅是数据库、没有固定查询语言、键值对存储、列存储、文档存储、图形数据库(社交关系)、最终一致性,CAP定理和BASE(异地多活)、高性能、高可用、高可扩展性

了解3V+3高
大数据的3V:主要是描述问题的
海量Volume
多样Variety
实时Velocity
三高:对程序的要求
高并发
高可扩(随时水平拆分,机器不够了,可以扩展机器来解决)
高性能(保证用户体验和性能)

真正在公司中的实践:NoSQL+Redis

阿里巴巴技术演进

技术不能急,慢慢学才能扎实。
敏捷开发,极限编程
开源才是技术的王道
如果未来想当一个架构师,没有什么是加一层解决不了的

1.商品的基本信息
名称、价格、商家信息
关系型数据库就可以解决了,MySQL/Oracle
淘宝内部的mysql不是我们用的mysql
2.商品的描述:评论(文字比较多)
文档型数据库中,MongoDB
3,图片
分布式文件系统,FastDFS
淘宝自己的 TFS
Google的 GFS
Hadoop的HDFS
阿里云的 oss
4.商品关键字
搜索引擎 solr elasticsearch
ISearch:多隆
5. 商品热门的波段信息
6. 内存数据库
Redis,Tair,Memacache
7. 商品的交易,外部的支付接口
三方应用

大型互联网的问题:
数据类型太多
数据源多,经常重构
数据要改造,大面积改造

NoSQL四大分类

1.KV键值对:
新浪:Redis
美团:Redis+Tiar
阿里+百度:redis+memeache

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

MongoDB(掌握):基于分布式文件存储的数据库,C++编写,主要用来处理大量文档,是一个介于关系型数据库和非关系型数据库之间的交集,属于非关系数据库中的功能最丰富最像关系型数据库的
CountDB

列数据库

Hbase
分布式文件系统
图关系数据库
不是图形,是关系。Neo4j、InfoGrid
四者对比
Redis学习_第4张图片

Redis

什么是Redis

redis(Remote Dictionary Server)远程字典服务,是一个开源的使用C语言编写、支持网络、可基于存储内容亦持久化的日志类型,Kay-Value数据库,并提供多种语言的API。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

能做什么

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

特性

多样化数据类型
持久化
集群
事务

安装Redis

Window安装

1.下载:https://github.com/dmajkic/redis/releases
2.解压即可使用
3.开启服务,开通6379
Redis学习_第5张图片

4.使用redis客户端链接redis
Redis学习_第6张图片

Linux安装

安装连接:
https://blog.csdn.net/qq_39135287/article/details/83474865?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160427974219724813256379%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160427974219724813256379&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-83474865.pc_search_result_cache&utm_term=linux%E4%B8%8B%E5%AE%89%E8%A3%85redis&spm=1018.2118.3001.4449
遇到问题: 版本6.0要升级
server.c:5159:49: error: ‘struct redisServer’ has no member named ‘supervised’
int background = server.daemonize && !server.supervised;
^
server.c:5163:29: error: ‘struct redisServer’ has no member named ‘pidfile’
if (background || server.pidfile) createPidFile();
^
server.c:5168:16: error: ‘struct redisServer’ has no member named ‘sentinel_mode’
if (!server.sentinel_mode) {
^
server.c:5178:19: error: ‘struct redisServer’ has no member named ‘cluster_enabled’
if (server.cluster_enabled) {
^
server.c:5186:19: error: ‘struct redisServer’ has no member named ‘ipfd_count’
if (server.ipfd_count > 0 || server.tlsfd_count > 0)
^
server.c:5186:44: error: ‘struct redisServer’ has no member named ‘tlsfd_count’
if (server.ipfd_count > 0 || server.tlsfd_count > 0)
^
server.c:5188:19: error: ‘struct redisServer’ has no member named ‘sofd’
if (server.sofd > 0)
解决方法:
https://blog.csdn.net/xixiyuguang/article/details/106612841

默认安装路径:/usr/local
Redis学习_第7张图片
将配置文件复制到当前文件下
Redis学习_第8张图片
默认不是后台启动的,修改配置文件,vim redis.conf
Redis学习_第9张图片
修改为yes 以后就是后台启动了

启动redis服务,要到指定位置
Redis学习_第10张图片
启动成功

使用客户端连接,并测试成功
Redis学习_第11张图片
查看redis服务是否开启
Redis学习_第12张图片
11.关闭redis服务 shutdown
在这里插入图片描述
在这里插入图片描述
关闭成功

Redis性能测试工具

redis-benchmark是一个压力测试工具,官方自带的测试工具,以下是填写的一些参数
Redis学习_第13张图片

简单测试:

测试100个并发连接,发100000次请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
Redis学习_第14张图片

如何分析?

Redis学习_第15张图片

Redis基础入门

redis默认有16个数据库,默认使用第0个,可以使用select来切换数据库

127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> dbsize 查看数据库大小
(integer) 0
127.0.0.1:6379[3]>
Redis学习_第16张图片
127.0.0.1:6379[3]> flushdb # 清空当前数据库 flushall 清空所有数据库
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]>

redis是单线程的!

redis很快的,官方表示,redis是基于内存操作,cpu不是redis的性能瓶颈,它是根据机器的内存和网络带宽,既然可以使用单线程来完成,那就是用单线程操作。
redis是c写的,官方数据每秒100000+的QPS,完全不比同样的Memecache使用的key-value差!

redis为什么单线程还那么快

误区1:高性能的服务器一定是多线程的?
误区2:多线程(cpu上下文会切换)一定比单线程效率高
先去cpu>内存>硬盘
核心是redis是将所有的数据全部存放在内存中的,所以说使用单线程去操作效率最高,多线程(cpu上下文切换:耗时操作),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个cpu中的,在内存情况下,这个时最佳方案。

五大数据类型

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

Redis-Key

127.0.0.1:6379> exists name  # 判断值是否存在
(integer) 1
127.0.0.1:6379> exists t
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> move name 1 # 移除某一个值 
(integer) 1
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> 
127.0.0.1:6379> expire name 3  #设置值的失效时间 为3秒
(integer) 1
127.0.0.1:6379> ttl name  # 查看你失效时间 ttl=time to love
(integer) -2 # 表示已经失效
127.0.0.1:6379> keys * # 查看所有的key
1) "tt"
2) "myhash:{tag}:__rand_int__"
3) "key:{tag}:__rand_int__"
4) "mylist:{tag}"
5) "counter:{tag}:__rand_int__"
127.0.0.1:6379> type name
none
127.0.0.1:6379> type tt  #查看数据类型
string
127.0.0.1:6379> 

String(字符串)

127.0.0.1:6379> flushall  #清空所有数据库的数据
OK
127.0.0.1:6379> keys * # 查看数据库中所有的key
(empty array) 
127.0.0.1:6379> set name "ty"  # 设置一个key
OK
127.0.0.1:6379> get name # 得到一个key
"ty"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> append name ",yy" #往name后面追加
(integer) 5
127.0.0.1:6379> exists name #查看是否存在name
(integer) 1
127.0.0.1:6379> strlen name #查看name的长度
(integer) 5
127.0.0.1:6379> get name
"ty,yy"
127.0.0.1:6379> append name " ,oo."
(integer) 10
127.0.0.1:6379> get name
"ty,yy ,oo."
########## 步长 i++ i+= ##############
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views  #自增1
(integer) 1
127.0.0.1:6379> get views
"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
(integer) 1
127.0.0.1:6379> get views'
Invalid argument(s)
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> incrby views 10 #一次性加10
(integer) 11
127.0.0.1:6379> get views
"11"
127.0.0.1:6379> decrby views 10 #一次性减少10
(integer) 1
127.0.0.1:6379> get views
"1"
# 字符串范围 getrange  字符串替换 setrange
127.0.0.1:6379> set key1 "123456789ertyuiop"
OK
127.0.0.1:6379> get key1
"123456789ertyuiop"
127.0.0.1:6379> getrange key1 0 2
"123"
127.0.0.1:6379> getrange key1 0 -1 
"123456789ertyuiop"
127.0.0.1:6379> setrange key1 2 xx
(integer) 17
127.0.0.1:6379> get key1
"12x

你可能感兴趣的:(redis,redis)