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

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

    src/redis-server

  4. 使用:启动客户端

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

通过一些博文宏观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类型

关于二进制安全的讲解。

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 ## 解决分布式锁 方案之一

应用场景

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

常用场景

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. 去用

案例实操:限制登陆

牛逼:

这里的自动注入。

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

Redis的其他数据类型

String

Hash

List

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

Set

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

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

sadd

sdiff

Zset

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

zadd

默认从低到高排序

zrange 取值

zrevrange 从高到低取值

zcount 取值指定值区间的key

Redis的发布订阅

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

Redis多数据库

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

Redis事务

https://redis.io/topics/transactions

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

串行化的命令执行。

错误分两种:

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

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

Redis数据淘汰策略

Redis的持久化

RDB,AOF两种机制

RDB是通过快照

AOF是通过一定时间间隔

Redis与缓存数据库一致性

缓存雪崩:

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

缓存穿透:

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

canal工具:主从数据同步

主从同步

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

触发器

Redis脚本

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

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

执行脚本的常用命令为Eval

Redis高级

可能存在的问题

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

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

高可用

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

高并发

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

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

提高系统的并发能力

如何提高并发能力?

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

主从赋值

如何实现

单机故障问题

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

Redis Cluster 集群

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

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

无中心结构

Redis Cluster集群特点

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

容错性

Redis-cluster 节点分配

Redis集群搭建

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

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

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

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

Redis——入门学习笔记的更多相关文章

  1. Redis入门学习笔记一

    Redis 简要描述: 1.  Redis 是啥 ? Redis 英文名称全称为: Remote Dictionary Server ,中译为远程字典服务器. 是一款区分于磁盘数据库如(Mysql)的 ...

  2. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  3. Redis:学习笔记-01

    Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...

  4. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  5. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  6. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  7. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  8. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  9. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

随机推荐

  1. layui 时间插件,change&&done,按照官网写法无效,解决方式!

    摘抄自 hahei2020:https://blog.csdn.net/hahei2020/article/details/79285370 layui 时间插件, 当选择时间或时间发生改变后,按照官 ...

  2. 《剑指offer》面试题19. 正则表达式匹配

    问题描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  3. HDC2021技术分论坛:组件通信、硬件池化,这些创新技术你get了吗?

    作者:ligang 华为分布式硬件技术专家,sunbinxin 华为应用框架技术专家 HarmonyOS是一款全新的分布式操作系统,为开发者提供了元能力框架.事件通知.分布式硬件等分布式技术,使能开发 ...

  4. 【刷题-LeetCode】203. Remove Linked List Elements

    Remove Linked List Elements Remove all elements from a linked list of integers that have value *val* ...

  5. 【分享代码】bash中对一个逗号分隔的列表去重

    直接上代码: #!/bin/bash dedup_list(){ v_list=$(echo "$1" | sed "s/,/\n/g" | sort -u | ...

  6. gin中自定义中间件

    package main import ( "github.com/gin-gonic/gin" "log" "time" ) func L ...

  7. 你可能不知道的Animation动画技巧与细节

    引言 在web应用中,前端同学在实现动画效果时往往常用的几种方案: css3 transition / animation - 实现过渡动画 setInterval / setTimeout - 通过 ...

  8. python操作MySQL数据库连接

    目录 一:python操作MySQL 1.python如何操作MySQL? 2.什么是 PyMySQL? 二:PyMySQL 安装 1.方法一: 2.方法二: 三:pyMySQL模块基本使用 1.py ...

  9. ApacheCN C# 译文集 20211124 更新

    C# 代码整洁指南 零.前言 一.C# 代码标准和原则 二.代码审查--过程和重要性 三.类.对象和数据结构 四.编写整洁的函数 五.异常处理 六.单元测试 七.端到端系统测试 八.线程和并发 九.设 ...

  10. NOIP2017 Day2T3 列队

    首先可以观察到这样一个事实,如果 \((x, y)\) 出队,那么只会影响 \(x\) 这一行,以及最后一列的排布.并且可以发现,每次一个人出队,总会对最后一列有影响,因此我们可能需要将最后一列单独拿 ...