• Redis系列(一)Redis入门


    NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,后面再加上面试题。

    Redis 系列:

    1. Redis系列(一)Redis入门
    2. Redis系列(二)Redis的8种数据类型
    3. Redis系列(三)Redis的事务和Spring Boot整合
    4. Redis系列(四)Redis配置文件和持久化
    5. Redis系列(五)发布订阅模式、主从复制和哨兵模式
    6. Redis系列(六)Redis 的缓存穿透、缓存击穿和缓存雪崩
    7. Redis系列(七)Redis面试题
    8. Redis命令参考

    1、什么是 NoSQL

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

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

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

    很多的数据类型比如用户的个人信息,社交网络,地理位置。这些数据类型的存储不需要一个固定的格式!不需要多余的操作就可以横向扩展的。Map<String, Object> 使用键值对来控制。

    NoSQL 的特点

    1、方便扩展(数据之间没有关系,很好扩展)

    2、大数据量高性能(Redis一秒写8万次,读取 11 万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高)

    3、数据类型是多样型的(不需要事先设计数据库,随取随用)

    传统 RDBMS 和 NoSQL的比较

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

    2、NoSQL 的四大分类

    KV 键值对:Redis

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

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

    列存储数据库:

    • HBase
    • 分布式文件系统

    图关系数据库:

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

    3、Redis 入门

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

    是一个开源的使用 ANSI C语言编写、支持网络、可基于内存亦可持久刷的日志型、key-value 数据库,并提供多种语言的 API。免费和开源!是当下最热门的NoSQL 技术之一,也被人们称之为机构化数据库。

    Redis 的作用

    1、内存存储、持久化(RDB 和 AOF)

    2、效率高,可以用于高速缓存

    3、发布订阅系统

    4、地图信息分析

    5、计数器、计时器(比如浏览量)

    Redis 的特征:

    1、多样化的数据类型

    2、持久化

    3、集群

    4、事务

    Redis 官网: https://redis.io/

    Redis 中文网: http://www.redis.cn/

    4、Redis 安装启动

    到官网下载压缩包,上传到服务器

    [root@itzhouc opt]# ll
    -rw-r--r-- 1 root root 2002463 Apr 29 00:18 redis-5.0.8.tar.gz
    [root@itzhouc opt]# tar -zxvf redis-5.0.8.tar.gz 		# 解压
    [root@itzhouc redis-5.0.8]# yum install gcc-c++			# 增加环境支持
    [root@itzhouc redis-5.0.8]# make					   # 安装
    [root@itzhouc redis-5.0.8]# make install
    [root@itzhouc redis-5.0.8]# cd /usr/local/bin		    # 进入Redis的默认安装目录
    [root@itzhouc bin]# ls
    jemalloc-config  jeprof            luajit        mcrypt    redis-benchmark  redis-check-rdb  redis-sentinel
    jemalloc.sh      libmcrypt-config  luajit-2.0.4  mdecrypt  redis-check-aof  redis-cli        redis-server
    

    拷贝配置文件:

    [root@itzhouc bin]# mkdir kconfig
    [root@itzhouc bin]# cp /opt/redis-5.0.8/redis.conf kconfig/
    [root@itzhouc bin]# cd kconfig/
    [root@itzhouc kconfig]# ls
    redis.conf
    

    修改配置文件为后台启动:

    [root@itzhouc kconfig]# pwd
    /usr/local/bin/kconfig
    [root@itzhouc kconfig]# vim redis.conf 
    

    修改配置项:

    • daemonizeyes

    • 注释掉 bind 127.0.0.1

    • 修改protected-mode no

    启动 Redis

    [root@itzhouc bin]# ls
    jemalloc-config  jeprof   libmcrypt-config  luajit-2.0.4  mdecrypt         redis-check-aof  redis-cli       redis-server
    jemalloc.sh      kconfig  luajit            mcrypt        redis-benchmark  redis-check-rdb  redis-sentinel
    [root@itzhouc bin]# redis-server kconfig/redis.conf #通过特定的配置文件启动Redis
    8178:C 29 Apr 2020 08:43:40.043 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    8178:C 29 Apr 2020 08:43:40.043 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=8178, just started
    8178:C 29 Apr 2020 08:43:40.043 # Configuration loaded
    

    使用客户端连接和测试:

    [root@itzhouc bin]# redis-cli -p 6379 
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> set name test
    OK
    127.0.0.1:6379> get name
    "test"
    127.0.0.1:6379> 
    

    查看 Redis 进程:再开一个窗口

    [root@itzhouc ~]# ps -ef|grep redis
    root      8179     1  0 08:43 ?        00:00:00 redis-server 127.0.0.1:6379
    root      8210  3437  0 08:44 pts/1    00:00:00 redis-cli -p 6379
    root      8306  8281  0 08:48 pts/2    00:00:00 grep --color=auto redis
    

    退出Redis:

    127.0.0.1:6379> shutdown		# 关闭Redis 
    not connected> exit				# 退出
    [root@itzhouc bin]# ps -ef|grep redis
    root      8330  3437  0 08:49 pts/1    00:00:00 grep --color=auto redis
    [root@itzhouc bin]# 
    
    

    后面可能会用到单机多 Redis 启动集群测试。

    5、Redis 性能测试

    redis-benchmark 是官网自带的压力测试工具。

    序号 选项 描述 默认值
    1 -h 指定服务器主机名 127.0.0.1
    2 -p 指定服务器端口 6379
    3 -s 指定服务器 socket
    4 -c 指定并发连接数 50
    5 -n 指定请求数 10000
    6 -d 以字节的形式指定 SET/GET 值的数据大小 2
    7 -k 1=keep alive 0=reconnect 1
    8 -r SET/GET/INCR 使用随机 key, SADD 使用随机值
    9 -P 通过管道传输 请求 1
    10 -q 强制退出 redis。仅显示 query/sec 值
    11 --csv 以 CSV 格式输出
    12 -l 生成循环,永久执行测试
    13 -t 仅运行以逗号分隔的测试命令列表。
    14 -I Idle 模式。仅打开 N 个 idle 连接并等待。

    使用方式:

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

    分析举例:

    ====== SET ======
      100000 requests completed in 1.97 seconds		  # 对 10万个请求进行写入测试
      100 parallel clients							# 100 个并发客户端 
      3 bytes payload								# 每次写入 3 个字节
      keep alive: 1									# 只有一台服务器来处理这些请求,即单机性能
    
    19.56% <= 1 milliseconds
    98.70% <= 2 milliseconds
    99.82% <= 3 milliseconds
    99.85% <= 9 milliseconds
    99.94% <= 10 milliseconds
    99.95% <= 126 milliseconds
    99.96% <= 127 milliseconds
    100.00% <= 127 milliseconds					# 所有请求在127 毫秒处理完成
    50761.42 requests per second				# 每秒处理 50761.42 个请求
    
    

    6、基础知识

    Redis 默认有 16 个数据库,这个可以在配置文件中查看。

    [root@itzhouc bin]# vim kconfig/redis.conf 
    
    
    # Set the number of databases. The default database is DB 0, you can select
    # a different one on a per-connection basis using SELECT <dbid> where
    # dbid is a number between 0 and 'databases'-1
    databases 16
    
    

    默认使用的是第 0 个。

    使用 select 命令切换数据库,使用 dbsize查看数据库大小:

    [root@itzhouc bin]# redis-cli -p 6379
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> select 3		# 切换数据库
    OK
    127.0.0.1:6379[3]> dbsize		# 查看数据库大小
    (integer) 0
    127.0.0.1:6379[3]> set name jack
    OK
    127.0.0.1:6379[3]> dbsize
    (integer) 1
    127.0.0.1:6379[3]> 
    
    

    查看数据库中所有的key

    127.0.0.1:6379[3]> keys *
    1) "name"
    127.0.0.1:6379[3]> 
    
    

    清除当前数据库:

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

    清除所有数据库:

    127.0.0.1:6379> flushall
    OK
    127.0.0.1:6379> keys *
    (empty list or set)
    
    

    7、Redis 是单线程的什么这么快(面试题)

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

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

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

    1、误区1:高性能的服务器一定是多线性的?

    2、误区2:多线程一定比单线程的效率高?

    要了解在执行效率上 CPU > 内存 > 硬盘

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

    redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。 参考文章

    下一篇笔记将介绍 Redis 的五大数据类型和三个特殊类型。

  • 相关阅读:
    php记录代码执行时间
    java中针对同一变量的不同函数的互斥操作
    Linux下mysql新建账号及权限设置
    Linux下重启apache
    Mysql数据导入
    ubuntu安装phpcurl与phptidy扩展
    Linux服务器间文件传输
    Flash本地传递大数据,图片数据,localconnection 超出大小,超出限制 bitmapdata 拂晓风起
    [Java][JavaScript]字符串数组与字符串之间的互转(join/split)(转) 拂晓风起
    java poi读取excel公式,返回计算值(转) 拂晓风起
  • 原文地址:https://www.cnblogs.com/itzhouq/p/redis1.html
Copyright © 2020-2023  润新知