前言

最近学习Redis6.x,特做笔记以备忘,与大家共学。课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eac,课程很不错,值得学习!关键是不要钱,嘻嘻!

Redis简介

Redis(REmote DIctionary Server 远程字典服务器)

Redis是一个使用C编写的、开源的、Key-Value型、基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一

Redis的两种基本使用方式

一种就是当作数据库缓存来使用

另外一种就是直接当作数据库来使用

Redis安装

1:去官网下载最新的版本:http://redis.io/download ,这里用的是6.0.8

2:解压后,进入解压好的文件夹

3:redis的安装非常简单,因为已经有现成的Makefile文件,所以直接先make,然后make install就可以了

注意:编译安装需要gcc5.3以上

4:安装的位置默认在/usr/local/bin ,有:

(1)redis-benchmark:性能测试工具,测试Redis在你的系统及配置下的读写性能
(2)redis-check-aof:用于修复出问题的AOF
(3)redis-check-rdb:用于修复出问题的rdb文件
(4)redis-cli:Redis命令行操作工具
(5)redis-sentinel:Redis集群的管理工具
(6)redis-server:Redis服务器启动程序

5:启动Redis的时候,只有一个参数,就是指定配置文件redis.conf的路径。redis.conf在解压的文件夹里面有,复制一个出来,按需修改即可,也可--port来指定端口

基本的修改如下几个参数:
#daemonize no 改为yes,开启后台运行,默认是前台运行
daemonize yes #把这一行注释,监听所有IP
#bind 127.0.0.1 #protected-mode yes 如果改为no,则是关闭保护模式,这种模式下不能配置系统服务,建议还是开启
protected-mode yes #修改本参数,指定数据目录
dir /mydata/redis6/data #修改本参数,指定日志目录
logfile /mydata/redis6/redis_6379.log

6:连接Redis并操作,使用redis-cli,如果有多个实例,可以redis-cli -h 服务器ip -p 端口 -u 用户 -a密码

7:关闭Redis,redis-cli shutdown,如果有多个实例,可以指定端口来关闭:redis-cli -p 6379 shutdown

Redis基础知识

单线程模型

Redis的服务器程序采用的是单线程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。

Redis的实际处理速度完全依靠主进程的执行效率,假如同时有多个客户端并发访问服务器,则服务器处理能力在一定情况下将会下降。假如你要提升服务器的并发能力,那么可以采用在单台机器部署多个redis进程的方式。

I/O多线程

Redis6开始支持I/O多线程。

目前Redis主要的性能瓶颈之一,就在于I/O数据的读写性能。 Redis6引入的“多线程”机制就是对于该瓶颈的优化。

核心思路是,将主线程的 I/O 读写任务拆分出来给一组独立的线程执行,使得多个 socket 的读写可以并行化。

多数据库

1:Redis每个数据库对外都是以从0开始递增的数字来命名,默认16个数据库,默认使用0号数据库,可以使用Select 数字 来选择要使用的数据库

2:使用Dbsize可以查看当前数据库的key的数量

3:可以在多个数据库间移动数据,使用move key 目的数据库编号 就可以了

4:使用flushdb可以清除某个数据库的数据

5:Redis不支持自定义数据库名字

6:Redis不支持为每个数据库设置不同的访问密码

7:多个数据库之间并不是完全独立的,FlushAll可以清空全部的数据

8:Redis的数据库更像是一个命名空间

Redis的key

Redis的key是字符串类型,如果中间有空格或者转义字符等,要用“”。

1:命名建议:对象类型:对象ID:对象属性
2:多个单词之间以“.”来分隔
3:Key的命名,应该在可读的情况下,尽量简短

Redis的Value支持五种类型

1:String:字符串,可以存储String、Integer、Float型的数据,甚至是二进制数据,一个字符串最大容量是512M

2:List:字符串List,底层实现上不是数组,而是链表,也就是说在头部和尾部插入一个新元素,其时间复杂度是常数级别的;其弊端是:元素定位比数组慢

3:Set:字符串Set,无序不可重复,是通过HashTable实现的

4:Hash:按Hash方式来存放字符串

5:ZSet:字符串Set,有序且不可重复,根据Score来排序。底层使用散列表和跳跃表来实现,所以读取中间部分数据也很快

对Key的操作命令

1:Keys:获得符合规则的键名列表
格式是keys pattern,pattern支持glob风格通配符格式:
(1)? 匹配一个字符
(2)* 匹配任意个字符
(3)[] 匹配中括号内的任一字符,可以用-来表示一个范围
(4)\x 匹配字符x,用于转义符号
2:exists:判断键值是否存在,格式是exists key
3:del:删除key,格式是del key。
小技巧:Del命令不支持通配符,可以结合linux管道和xargs命令来自定义删除,示例如下:redis-cli keys k* | xargs redis-cli del
4:type:获得键值的数据类型,格式是type key
5:rename:改名,格式是rename oldKey newKey
6:renamenx:如果不存在则创建,格式是rename oldKey newKey
7:randomkey:随机返回一个key

String类型的操作

Redis的String类型可以是字符串、数字、或者是二进制数据(图片、音频、视频)等,但是值最大不能超过512MB

对String类型的操作命令

1:get、set、del:获取key的值、设置key和值、删除key
类似的set命令还有:setex,psetex,setnx
2:incr、decr:递增和递减整数值,格式是incr key值
3:incrby、decrby:递增和递减整数值,可指定增减的数值,格式是incrby key值 正负数值
4:incrbyfloat:递增和递减浮点数值,格式是incrbyfloat key值 正负数值
5:append:在尾部追加值,格式是append key值 追加的值
6:getrange:获取指定索引范围内的值,格式是getrange key值 起始索引 结束索引
7:setrange:从索引位置开始设置后面的值,格式是setrange key值 offset索引 值
8:strlen:返回键值的长度,格式是strlen key值
9:mget:同时获得多个键的值,格式是mget 多个key值
10:mset:同时设置多个键值对,格式是mset key值 value , key和value可以多对
11:bitcount:获取范围内为1的二进制位数,格式是bitcount key值 [start end]
12:getbit:获取指定位置的二进制位的值,格式是getbit key值 offset索引
13:setbit:设置指定位置的二进制位的值,格式是setbit key值 offset索引 值
14:bitop:对多个二进制值进行位操作,格式是bitop 操作 目的key key值1 key值2,操作有and、or、xor、not,key值可以是多个
15:getset:原子的设置key的值,并返回key的旧值 ,格式是getset key value

对List类型的操作命令

1:lpush/rpush:添加值,格式是 rpush list的key item项的值,值可以是多个
2:lpushx/rpushx:只有当list存在时才会从左/右边依次追加元素
3:linsert:插入元素,格式是linsert list的key before|after 定位查找的值 添加的值
4:lrange:按索引范围获取值,格式是 lrange list的key 起始索引 终止索引,-1表示最后一个索引
5:lindex:获取指定索引的值,格式是 lindex list的key 索引号
6:lpop/rpop:弹出值,格式是 lpop list的key
7:llen:获取元素个数,格式是llen list的key
8:lrem:删除元素,格式是lrem list的key 数量 item项的值,数量可正负,表示从左或右删除,如果数量为0,表示删除全部与给定值相等的项
9:ltrim:保留指定索引区间的元素,格式是ltrim list的key 起始索引 结束索引
10:blpop/brpop:弹出值,格式是blpop list的key值 过期时间,key可以是多个,如果没有值,会一值等待有值,直到过期
11:rpoplpush:将元素从一个列表转移到另外一个列表,格式是rpoplpush 源list的key值 目的list的key值
12:brpoplpush:将元素从一个列表转移到另外一个列表,格式是brpoplpush 源list的key值 目的list的key值 过期时间
13:lset:设置指定索引的值,格式是lset list的key 索引 新的值

对Set类型的操作命令

1:sadd:添加元素,格式是 sadd set的key item项的值,item项可以多个
2:smembers:获取集合中所有元素,格式是 smembers set的key
3:sismember:判断元素是否在集合中,格式是 sismember set的key item项的值
4:srem:删除元素,格式是 srem set的key item项的值
5:scard:获取集合中元素个数,格式是scard set的key
6:srandmember:随机获取集合中的元素,格式是srandmember set的key [数量],数量为正的时候,会随机获取这么多个不重复的元素;如果数量大于集合元素个数,返回全部;如果数量为负,会随机获得这么多个元素,可能有重复
7:spop:弹出元素,格式是spop set的key
8:smove:移动元素,格式是smove 源set的key 目的set的key item项的值
9:sdiff:差集,返回在第一个set里面而不在后面任何一个set里面的项,格式是sdiff set的key 用来比较的多个set的key
10:sdiffstore:差集并保留结果,格式是命令 存放结果的set的key set的key 用来比较的多个set的key
11:sinter:交集,返回多个set里面都有的项,格式是sinter 多个set的key
12:sinterstore:交集并保留结果,格式是sinter 存放结果的set的key 多个set的key
13:sunion:并集,格式是sunion 多个set的key
14:sunionstore:并集并保留结果,格式是sunionstore 存放结果的set的key 多个set的key

对Hash类型的操作命令

1:hset:设置值,格式是hset Hash的Key 项的key 项的值
2:hmset:同时设置多对值,格式是hmset Hash的Key 项的key 项的值,项的key和值可多对
3:hgetall:获取该Key下所有的值,格式是hgetall Hash的Key
4:hget:获取值,格式是hget Hash的Key 项的key
5:hmget:同时获取多个值,格式是hmget Hash的Key 项的key,项的key可以是多个
6:hdel:删除某个项,格式是hdel Hash的Key 项的key
7:hlen:获取Key里面的键值对数量,格式是hlen Hash的Key
8:hstrlen:返回指定filed对应的value的字符长度
9:hexists:判断键值是否存在,格式是hexists Hash的Key 项的key
10:hkeys:获取所有Item的key,格式是hkeys Hash的Key
11:hvals:获取所有Item的值,格式是hvals Hash的Key
12:hincrby:增减整数数字,格式是hincrby Hash的Key 项的key 正负整数
13:hincrbyfloat:增减Float数值,格式是hincrbyfloat Hash的Key 项的key 正负float
14:hsetnx:如果项不存在则赋值,存在时什么都不做,格式是hsetnx Hash的Key 项的key 项的值

ZSet类型的操作

ZSet和Set一样是string类型元素的集合,且不允许重复。不同的是,ZSet中每个元素都会关联一个double类型的分数,并按照分数来为集合中的成员进行从小到大的排序

对ZSet类型的操作命令

1:zadd:添加元素,格式是zadd zset的key score值 项的值,Score和项可以是多对,score可以是整数,也可以是浮点数,还可以是+inf表示正无穷大,-inf表示负无穷大
2:zrange:获取索引区间内的元素,格式是zrange zset的key 起始索引 终止索引 (withscores)
3:zrangebyscore:获取分数区间内的元素,格式是zrangebyscore zset的key 起始score 终止score (withscores),默认是包含端点值的,如果加上“(”表示不包含;后面还可以加上limit来限制
4:zrem:删除元素,格式是zrem zset的key 项的值,项的值可以是多个
5:zcard:获取集合中元素个数,格式是zcard zset的key
6:zincrby:增减元素的Score,格式是zincrby zset的key 正负数字 项的值
7:zcount:获取分数区间内元素个数,格式是zcount zset的key 起始score 终止score
8:zrank:获取项在zset中的索引,格式是zrank zset的key 项的值
9:zscore:获取元素的分数,格式是zscore zset的key 项的值,返回项在zset中的score
10:zrevrank:获取项在zset中倒序的索引,格式是zrevrank zset的key 项的值
11:zrevrange:获取索引区间内的元素,格式是zrevrange zset的key 起始索引 终止索引 (withscores)
12:zrevrangebyscore:获取分数区间内的元素,格式是zrevrangebyscore zset的key 终止score 起始score (withscores)
13:zpopmax:从集合中弹出分数最高的成员,返回该成员和分值,然后从集合中将其移出
14:zpopmin:从集合中弹出分数最低的成员,返回该成员和分值,然后从集合中将其移出
15:bzpopmax:在参数中的所有集合均为空的情况下,阻塞连接。参数中包含多个有序集合时,按照参数中key的顺序,返回第一个非空key中分数最大的成员和对应的分数。参数 timeout 可以理解为客户端被阻塞的最大秒数值,0 表示永久阻塞。
16:bzpopmin:在参数中的所有集合均为空的情况下,阻塞连接。参数中包含多个有序集合时,按照参数中key的顺序,返回第一个非空key中分数最小的成员和对应的分数。参数 timeout 可以理解为客户端被阻塞的最大秒数值,0 表示永久阻塞。
17:zremrangebyrank:删除索引区间内的元素,格式是zremrangebyrank zset的key 起始索引 终止索引
18:zremrangebyscore:删除分数区间内的元素,格式是命令 zset的key 起始score 终止score
19:zinterstore:交集,格式是ZINTERSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
20:zunionstore:并集,格式是ZUNIONSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

排序的操作

1:sort:可以对List、Set、ZSet里面的值进行排序。格式是SORT source-key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE dest-key]

2:by:设置排序的参考键,可以是字符串类型或者是Hash类型里面的某个Item键,格式是 Hash键名:->Item键。设置了by参考键,sort将不再依据元素的值来排序,而是对每个元素,使用元素的值替换参考键中的第一个””,然后获取相应的值,再对获得的值进行排序。如果参考键不存在,默认为0。

如果参考键值一样,再以元素本身的值进行排序。

3:get:指定sort命令返回结果包含的键的值,形如: Hash键名:*->Item键,可以指定多个get,返回的时候,一行一个。如果要返回元素的值,用get #。

4:对较大数据量进行排序会严重影响性能,使用建议:

(1)尽量减少待排序集合中的数据

(2)使用limit来限制获取的数据量

(3)如果要排序的数据量较大,可以考虑使用Store参数来缓存结果

处理过期keys的机制

1:定期删除:Redis会在后台,默认每秒10次的执行如下操作: 随机选取100个key校验是否过期,如果有25个以上的key过期了,立刻额外随机选取下100个key(不计算在10次之内)。也就是说,如果过期的key不多,Redis最多每秒回收200条左右,如果有超过25%的key过期了,它就会做得更多,这样即使从不被访问的数据,过期了也会被删除掉

2:惰性删除:当client主动访问key时,会先对key进行超时判断,过时的key会立刻删除

处理过期keys的命令

1:expire:设置过期时间,格式是expire key值 秒数
2:expireat:设置过期时间,格式是expireat key值 到秒的时间戳
3:ttl:查看还有多少秒过期,格式是ttl key值,-1表示永不过期,-2表示已过期
4:persist:设置成永不过期,格式是persist key值,删除key的过期设置;另外使用set或者getset命令为键赋值的时候,也会清除键的过期时间
5:pttl:查看还有多少毫秒过期,格式是pttl key值
6:pexpire:设置过期时间,格式是pexpire key值 毫秒数
7:pexpireat:设置过期时间,格式是pexpireat key值 到毫秒的时间戳

后记

我会持续的把我学习Redis6.x过程的笔记记录下来,跟大家一起学习。

Redis6.x学习笔记(一)的更多相关文章

  1. Redis6.x学习笔记(二)持久化之RDB

    前言 最近学习Redis6.x,特做笔记以备忘,与大家共学.课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值 ...

  2. Redis6.x学习笔记(四)复制

    复制概述 Redis支持复制的功能,以实现当一台服务器的数据更新后,自动将新的数据异步同步到其它数据库. Redis复制实现中,把数据库分为主数据库master和从数据库slave,主数据库可以进行读 ...

  3. Redis6.x学习笔记(五)哨兵

    前言 最近学习Redis6.x,特做笔记以备忘,与大家共学.课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值 ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  6. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  7. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  8. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  9. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

随机推荐

  1. 解决linux sudo apt-get install xx是2出现无法定位软件包方法

    解决办法: 在etc/apt/sources.list最后一行添加 deb http://archive.ubuntu.com/ubuntu/ trusty main universe restric ...

  2. Android中的TaskStack及启动模式

    目录 前言 如何观察ActivityStack? 几个问题 关键类介绍 ActivityStack的创建与种类 不同启动模式 launchMode Standard SingleTop SingleT ...

  3. Spring Native 项目,把 Spring 项目编译成原生程序!

    Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...

  4. 开源框架TLog核心原理架构解析

    前言 最近在做TLog 1.2.5版本的迭代,许多小伙伴之前也表示说很想参与开源项目的贡献.为了让项目更好更快速的迭代新特性以及本着发扬开源精神互相学习交流,很有幸招募到了很多小伙伴与我一起前行. 为 ...

  5. 关于HashMap的一些思考

    一.HashMap的负载因子的作用 当 HashMap 中的元素个数(包含链表.红黑树上的元素)达到数组长度的0.75倍的时候,开始扩容.   二.HashMap的负载因子为什么是0.75 主要是为了 ...

  6. 翻译:《实用的Python编程》08_01_Testing

    目录 | 上一节 (7.5 装饰方法 | 下一节 (8.2 日志) 8.1 测试 多测试,少调试(Testing Rocks, Debugging Sucks) Python 的动态性质使得测试对大多 ...

  7. @PostConstruct 使用记录

    @PostConstruct 从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这 ...

  8. Android创建自定义Application

    开发目的 创建一个自定义的MainApplication继承Application. 读取AndroidManifest.xml文件中Application节点的META-DATA数据.此处以ApiK ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

  10. 蒙特卡洛——使用CDF反函数生成非均匀随机数

    均匀随机数生成   先来说说均匀随机数生成,这是非均匀随机数的生成基础.   例如,我们现在有drand()函数,可以随机生成[0,1]范围内的均匀随机数. 要求一个drand2()函数,能够生成[0 ...