Redis——入门学习笔记

Redis学习

说到前面:这篇笔记只是我作为一个Redis新手,从0到认知的一个过程。后续会持续深入学习。

学习初衷和计划

学习Redis,因为这是热门技术,必须掌握的技术,别人都会我不会。就这一点就够了吧。一直以来一直听说Redis,也尝试了解过相关概念和基本语法,但是没有实际使用过。按照自己的学习计划,自己是需要通过官网系统的学习一遍的,就算有看不懂的知识,通过官网也不会有遗漏的知识点。另外一点就是通过此次系统学习形成自己的学习笔记,并且在自己的脑海中搭建起自己对Redis的知识体系的架构。

我打算怎么学呢:

  1. 通过通读官网,了解Redis是什么,有什么,能干什么,怎么用。建立起对Redis的初步认知
  2. 结合学习视频,检查自己学习时候关注的点是否为重要点。
  3. 通过看面试题,检查自己对各个知识点的掌握是否到位。
  4. 有机会就实战,通过实战将学习到的知识点学以致用,发现自己遇到和自己解决各种小问题。

这其实是我自己定的自学方案模板,为什么要用官网?

  1. 首先是英语,因为官网是英语的。提高自己的阅读英语的能力
  2. 其次是技术,因为官网是系统的。没有携带个人情绪,都是正确的知识点。
  3. 学,只系统的学一遍,然后查漏补缺,第一遍打基础,后面筑高楼。所以,切勿浮沙筑高楼

让我们愉快的开始学习吧。

其他学习资源:https://www.bilibili.com/video/av49517046?from=search&seid=5207085009732188353

Redis——初认识

Redis的基本介绍

https://redis.io/topics/introduction

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。 它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。 Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

You can run atomic operations on these types, like appending to a string; incrementing the value in a hash; pushing an element to a list; computing set intersection, union and difference; or getting the member with highest ranking in a sorted set.

In order to achieve its outstanding performance, Redis works with an in-memory dataset. Depending on your use case, you can persist it either by dumping the dataset to disk every once in a while, or by appending each command to a log. Persistence can be optionally disabled, if you just need a feature-rich, networked, in-memory cache.

为了获得出色的性能,Redis使用内存中的数据集。 根据您的用例,您可以通过将数据集偶尔转储到磁盘上,或者通过将每个命令附加到日志中来持久化它。 如果只需要功能丰富的网络内存缓存,则可以选择禁用持久性。

Redis also supports trivial-to-setup master-slave asynchronous replication, with very fast non-blocking first synchronization, auto-reconnection with partial resynchronization on net split.

Redis还支持琐碎的设置主从异步复制,具有非常快速的非阻塞首次同步,以及在网络拆分时具有部分重新同步的自动重新连接。

Redis is written in ANSI C and works in most POSIX systems like Linux, *BSD, OS X without external dependencies. Linux and OS X are the two operating systems where Redis is developed and tested the most, and we recommend using Linux for deploying. Redis may work in Solaris-derived systems like SmartOS, but the support is best effort. There is no official support for Windows builds.

Redis是用ANSI C编写的,并且可以在大多数POSIX系统中使用,例如Linux,* BSD,OS X,而无需外部依赖。 Linux和OS X是Redis开发和测试最多的两个操作系统,我们建议使用Linux进行部署。 Redis可以在基于Solaris的系统中使用,例如SmartOS,但是尽力而为。 Windows版本没有官方支持。

下载安装。

  1. 下载安装,官网自带安装教程,点击就下载了。(也可以手动下载tar包)

    $ wget http://download.redis.io/releases/redis-5.0.7.tar.gz
    $ tar xzf redis-5.0.7.tar.gz
    $ cd redis-5.0.7
    $ make
    
  2. 测试:

    安装完成之后,会提示你执行:(此操作让我电脑起飞了)

      make redis-test
    

    image-20200304075628793

  3. 运行:(这里默认安装在系统变量的src/目录下了)

    src/redis-server
    

    image-20200304080031158

  4. 使用:启动客户端

    src/redis-cli
    
    redis> set foo bar
    OK
    redis> get foo
    "bar"
    

    image-20200304083156555

通过一些博文宏观Redis

  1. https://zhuanlan.zhihu.com/p/37055648

    先介绍了Redis的架构,和基本使用的原因。然后介绍了由一到多的集群搭建原因。和具体的实现手段。如集群,主从复制等。接下来深入Redis底层,介绍其底层数据结构和实现原理。最后介绍有问题还是查看官网,官网的资料是一手的

    这就如,先学java,然后用框架,然后再回头看JVM和Java底层的实现。nice。

  2. https://www.jianshu.com/p/56999f2b8e3b

  3. https://www.cnblogs.com/CodeBear/p/12402932.html

2020年03月16日07:23:16

简单笔记:

  1. Redis的简单介绍
  2. Redis的基本类型介绍
  3. Redis的基本命令
  4. Java客户端连接Redis,操作Redis
  5. Redis的数据库连接池和数据库连接池的配置(JedisPoolConfig)
  6. 通过SpringData操作Redis

2020年03月17日04:25:04 - 按照一个系统的视频教学来看一遍先

https://www.bilibili.com/video/av49517046?p=2

Redis简介

Redis是完全免费的,遵守BSD协议,是一个高性能的(NOSQL)的key-value数据库。Redis是一个开源的使用ANSI C语言编写,支持网络,可基于 内存

其他知识点补充

关系型数据库:

非关系型数据库

HBase是列存储数据库

MongoDB是文档类型数据库

Neo4j是图形(Graph)数据库

NoSQL数据库在以下几种情况下比较实用。

  1. 数据模型比较简单
  2. 需要灵活性更强的IT系统
  3. 对数据库性能要求较高
  4. 不需要高度的数据一致性
  5. 对于给定key,比较容易映射复杂之的环境

Redis与其他key-value缓存产品的三个特点

Redis的特点:

  1. 性能极高
  2. 原子性
  3. 丰富的特性
  4. 可持久化
  5. 支持集群
  6. 消息队列

Redis的安装

好多人说用Docker,为什么?Docker是什么?又有人说,体验一下原生态不好吗,非要Docker。

Linux安装

  1. GCC

  2. 解压,安装 Redis

  3. 启动服务器和客户端,ping

  4. 可以通过配置文件来修改默认参数,如端口号,启动方式,等等

    安装目录下的:redis.conf

    1. bind:默认可访问的绑定的IP,如果开放,默认只能本机访问。
    2. daemonize no 改为 yes: 改为守护进程启动
    3. pidfile: 默认pid存储的值的指定
    4. port 6379 :修改默认端口号:为什么是6379,因为6379在手机按键上MERZ对应的号码,女歌手的名字
    5. save:指定持久化的时间参数等
    6. requrepassword 密码
  5. 使用指定配置文件启动服务器端,启动的时候

  6. Redis关闭

    ## 第一种关闭:断电
    ##查询pid: ps -ef|grep -i redis
    kill -9 pid
    
    第二种:客户端关闭
    在客户端运行:shutdown
    

Redis常用命令描述

常用命令

## 公用命令
del key ##删除指定key
DUMP key ##序列化指定key
exists key ## 判断指定key是否存在
expire key seconds ##为指定key 设定指定过期时间
pexpire key milliseconds ## 毫秒
ttl key ## 查看key的存在时间, -1代表永久有效, -2 代表无效
pttl key ##以毫秒查看存在时间
persist b ## 移除过期时间
keys pattern ## 查询指定的key   ? 代表占用一个字符  * 代表通配符
randomkey ##从当前数据库中随机返回一个key
select 1 ## 切换到第二个数据库 一共默认0-15 16个数据库
rename a b ## 改名 a->b
move c 1 ## 把 c 移动到指定的数据库
type key ## 返回指定key的类型

应用场景

例如:Expire key seconds

  1. 限时的优惠活动信息
  2. 网站数据缓存(对于一些需要定时更新的数据,例如积分排行榜)
  3. 手机验证码
  4. 限制网站仿牌访问频率(例如:1分钟最多访问10次)

Key的命名建议

redis单个key存入512m大小

  1. key的命名不要太长,尽量不要超过1024字节,这不仅仅小号内存,而且会降低查询的效率。

  2. key也不要太短,太短的话,key的可读性会降低;

  3. 在一个项目中,key最好用同意的命名模式,例如 user:123:password;

  4. Key的命名区分大小写

    例如:users 对应Users表。 id,name,age等相关信息 存储之后为

    users:1:name 大娃

    users:2:name 二娃

    因为数据与数据之间是没有任何关联的,通过命名来解决。

Redis的类型

Redis的String类型

image-20200317054023991

关于二进制安全的讲解。

String命令

set key value
get key
setnx key value ## 在指定的key不存在的时候,为key设置值
getrange key start end ## 字符串截取 
getset key value ## 先取值,再赋值
strlen key ## 取长度
del key ##删除
incr key ##自增,如果没有,初始化为0,然后进行incr操作
decr key ## 自减
incrby key 10 ## 自定义自增增量 10 
decrby key 10 ## 自定义自减增量 10

重点介绍:
setnx key value ## 解决分布式锁 方案之一

应用场景

image-20200317055719285

Hash

Hash命令

## 基本语法
hset key field value ## 存一个
hget key field ## 取一个
hmset key field value [field value...] ## 存多个
hmget key field [field...] ##取多个
hgetall key ## 取所有
hkeys key ## 获取所有哈希表中的字段
hlen key ## 获取哈希表中字段的数量

##删除语法
hdel key field1[field2] ## 仅删除指定field

## 其他语法
hsetnx key field value  ## 如果不存在,存。
hincrby key field ## 对于int类型的可以自增。
hexist key field ##判断指定key的filed是否存在。

hash 不能覆盖 String, String可以覆盖Hash

常用场景

image-20200317061535574

Java通过Jedis操作Redis

package com.dawa.jedis;

import redis.clients.jedis.Jedis;

public class JedisDemo {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost",6379);
        String ping = jedis.ping();
        System.out.println(ping);

//        jedis.auth("dawa");

//        jedis.set("user:1", "这个是大娃");
//
        String s = jedis.get("user:2");
        System.out.println(s);

    }
}
    <dependencies>
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
        </dependency>
    </dependencies>

SpringData 整合Redis

SpringData 提供了RedisTemplate模板

https://spring.io/projects/spring-data-redis

Spring Data’s mission is to provide a familiar and consistent, Spring-based programming model for data access while still retaining the special traits of the underlying data store.

It makes it easy to use data access technologies, relational and non-relational databases, map-reduce frameworks, and cloud-based data services.

Spring Data的任务是为数据访问提供一个熟悉且一致的,基于Spring的编程模型,同时仍保留基础数据存储的特殊特征。

它使使用数据访问技术,关系和非关系数据库,map-reduce框架以及基于云的数据服务变得容易。

这里学习springdata提供的Redis操作。

Spring Data Redis, part of the larger Spring Data family, provides easy configuration and access to Redis from Spring applications. It offers both low-level and high-level abstractions for interacting with the store, freeing the user from infrastructural concerns.

视频讲的使用过程

  1. 通过配置文件,Spring整合Springdata-Redis
  2. 一些默认属性的配置
  3. 去用

案例实操:限制登陆

image-20200318131051049

牛逼:

这里的自动注入。

上面的 hash 和下面的 string。 这里运用返回值的方法。自动注入

image-20200318202842144

image-20200318202750106

Redis的其他数据类型

String

Hash

List

使用场景:任务队列(举例:快递流程)

Set

无需集合,类似于java中的hashtable。集合成员唯一

差集,交集,并集等操作。

sadd

sdiff

Zset

有序集合,集合成员唯一。

zadd

默认从低到高排序

zrange 取值

zrevrange 从高到低取值

zcount 取值指定值区间的key

Redis的发布订阅

image-20200319064538696

image-20200319064552060

image-20200319064610908

image-20200319064642743

image-20200319064925710

这个两个功能是Web开发中用到的最多的。

Redis多数据库

其实这里说的就是 0-15 这16个仓库

image-20200319065110614

Redis事务

https://redis.io/topics/transactions

Redis事务的作用:保证一连串的命令按照串行化执行。

串行化的命令执行。

image-20200319065318808

image-20200319065430551

image-20200319065646254

image-20200319065706586

image-20200319065744109

错误分两种:

  1. 业务逻辑错误。 在事务操作中,如果出错,会跳过。继续执行下一个。
  2. 命令语法错误。在事务操作中,如果语法出错,则禁止执行事务操作。

Watch用来监控某个Key在事务的操作过程中,是否被修改。

image-20200319131614543

Redis数据淘汰策略

image-20200319131840416

image-20200319131905669

Redis的持久化

RDB,AOF两种机制

RDB是通过快照

AOF是通过一定时间间隔

3

Redis与缓存数据库一致性

缓存雪崩:

缓存大量失效的时候,发生大量的缓存穿透。所有的查询都落在了数据库上,造成了缓存雪崩。

image-20200319190933919

缓存穿透:

如100万人同时访问,第一次一定不存在的数据。数据库查的为Null,且存不到缓存中。

image-20200319185001295

canal工具:主从数据同步

image-20200319191049945

主从同步

采用UDF自定义函数的方式完成缓存同步

触发器

Redis脚本

Lua:Redis脚本使用lua解释器来执行脚本。

Redis2.6版本通过内嵌支持Lua环境。

执行脚本的常用命令为Eval

Redis高级

可能存在的问题

Redis运用于工程项目中,一台Redis是万万不能的。

  1. 从架构上:单个服务会发生单点故障。(容错性低)
  2. 从容量上,单个Redis的容量有限。

高可用

如何才能保证其服务的高可用

image-20200319191630430

高并发

如12306,8点抢票,最少几百万

  1. 响应时间
  2. 吞吐量
  3. QPS:每秒查询率
  4. 并发用户数

image-20200319191737963

提高系统的并发能力

如何提高并发能力?

  1. 垂直扩展
  2. 水平扩展

image-20200319192041796

image-20200319192239141

主从赋值

image-20200319193008875

如何实现

image-20200319192952267

单机故障问题

主从同步的时候,主机如果只有一个,故障了,还是要废掉。

Redis Cluster 集群

image-20200319193158058

image-20200319193344421

哨兵模式就是集群出现之前的一种解决方案。3.0版本之后,出现了集群的概念。

分布式:不同的业务,分布在不同的服务器上。

无中心结构

Redis Cluster集群特点

image-20200319193502017

客户端与Redis节点直接连接,不需要访问中间的Proxy层。

容错性

image-20200319193749761

Redis-cluster 节点分配

image-20200319194021803

Redis集群搭建

image-20200319194148790

image-20200319194305985

  1. 创建7个Redis服务器。(copy7个配置文件)
  2. 搭建
  3. 创建集群
  4. 使用。测试。

接下来,进入官网自学环节

后续会深入学习,从实际应用入手。当然,也会从实际的面试题入手。

这个笔记仅仅记录了 花费一天的时间去了解Redis。

猜你喜欢

转载自www.cnblogs.com/bigbaby/p/12549948.html