Redis学习日志——redis入门

感谢狂神提供的学习资源!https://www.bilibili.com/video/BV1S54y1R7SB

概述

Redis是什么

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

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

是当下最热门的NoSQL技术之一!

也被称为结构化数据库!

Redis可以做什么

  1. 内存存储+持久化(RDB+AOF)

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

  3. 发布订阅系统

  4. 地图信息分析

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

特性

  1. 多样的数据类型

  2. 持久化

  3. 集群

  4. 事物

安装

  1. 下载源码,并复制到/opt

  2. 解压后make编译

  3. 进入/usr/local/bin查看
    Redis学习日志——redis入门_第1张图片

  4. 将默认conf复制到自定义的配置文件夹
    Redis学习日志——redis入门_第2张图片

    以后就用这个配置文件启动redis

  5. redis默认不是后台启动的,需要修改配置文件

Redis学习日志——redis入门_第3张图片

  1. 启动redis-server,并使用redis-cli连接
    image-20200921215925027.png
    在这里插入图片描述

  2. 关闭服务
    Redis学习日志——redis入门_第4张图片

  3. 配置为系统服务

    • 进入/usr/lib/systemd/system/,创建redis.service

      #表示基础信息
      [Unit]
      #描述
      Description=Redis
      #在哪个服务之后启动
      After=syslog.target network.target remote-fs.target nss-lookup.target
      
      #表示服务信息
      [Service]
      Type=forking
      #注意:需要和redis.conf配置文件中的信息一致
      PIDFile=/var/run/redis_6379.pid
      #启动服务的命令
      #redis-server安装的路径 和 redis.conf配置文件的路径
      ExecStart=/usr/local/bin/redis-server /usr/local/bin/zyjconfig/redis.conf
      #重新加载命令
      ExecReload=/bin/kill -s HUP $MAINPID
      #停止服务的命令
      ExecStop=/bin/kill -s QUIT $MAINPID
      PrivateTmp=true
      
      #安装相关信息
      [Install]
      #以哪种方式启动
      WantedBy=multi-user.target
      #multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。
      
    • 使用systemctl daemon-reload重启服务

    • 然后就可以用systemctl start redis.service 开启redis了

简单测试性能

测试参数如下:

Redis学习日志——redis入门_第5张图片

简单测试一下:

# 测试:100个并发链接	每个并发10000个请求
redis-benchmark -p 6379 -c 100 -n 10000

Redis学习日志——redis入门_第6张图片

如何查看分析:
Redis学习日志——redis入门_第7张图片

  1. 10000个请求0.1s完成
  2. 100个并发客户端
  3. 每次写入3个字节
  4. keep alive = 1,只有一台服务器来处理请求,即单机测试
  5. 1毫秒内完成一个请求的处理,每秒处理了104166.66个请求
  6. RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的数据快照写入磁盘。

基础的知识

  1. redis默认有16个数据库

image-20200922154432985.png

默认使用第0个数据库,可以通过select命令来切换数据库

  1. 常用的命令

    set和get

    127.0.0.1:6379> set name zyj		#通过set创建键值对
    OK
    127.0.0.1:6379> get name		#get取键的值
    "zyj"
    

    select和dbsize

    127.0.0.1:6379> select 3		#切换数据库
    OK
    127.0.0.1:6379[3]> dbsize		#查看数据库内容大小
    (integer) 0
    

    flushdb和flushall

    127.0.0.1:6379> keys *				#keys *查看当前数据库的键
    1) "counter:{tag}:__rand_int__"
    2) "myhash:{tag}"
    3) "key:{tag}:__rand_int__"
    4) "mylist:{tag}"
    127.0.0.1:6379> flushdb			#清空当前数据库
    OK
    127.0.0.1:6379> keys *
    (empty array)
    127.0.0.1:6379> flushAll			#清空所有数据库
    OK
    

    move和exists

    127.0.0.1:6379> keys *
    1) "name"
    127.0.0.1:6379> move name 1			#move	  将key移动到其他数据库
    (integer) 1
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> keys *
    1) "name"
    127.0.0.1:6379[1]> exists name		#exists 	查看当前库是否存在某个key
    (integer) 1
    

    expire和ttl

    127.0.0.1:6379[1]> keys *
    1) "name"
    2) "age"
    127.0.0.1:6379[1]> expire name 10		#expire   设置键的存活时间
    (integer) 1
    127.0.0.1:6379[1]> ttl name		#倒计时 ttl=time to live
    (integer) 7
    127.0.0.1:6379[1]> ttl name
    (integer) 6
    127.0.0.1:6379[1]> ttl name
    (integer) 5
    127.0.0.1:6379[1]> ttl name
    (integer) 4
    127.0.0.1:6379[1]> ttl name
    (integer) 3
    127.0.0.1:6379[1]> ttl name
    (integer) 2
    127.0.0.1:6379[1]> ttl name
    (integer) 1
    127.0.0.1:6379[1]> ttl name
    (integer) 0
    127.0.0.1:6379[1]> ttl name
    (integer) -2
    127.0.0.1:6379[1]> get name
    (nil)
    

    type

    127.0.0.1:6379[1]> type age		#type 查看key的类型
    string
    
  2. redis是单线程的

    redis是基于内存实现的,cpu不是redis的性能瓶颈,redis的性能取决于机器的内存和网络的带宽,

    既然能用单线程实现,那么就用单线程

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

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

    理解:redis是将所有的数据都放在内存中的,所以对于内存系统来说,单线程就是最有效率的,读写都在同一片CPU上;而多线程的话会产生CPU调度耗时,自然在内存系统中就没有单线程快。

你可能感兴趣的:(java学习之路,数据库,redis)