zoukankan      html  css  js  c++  java
  • Redis6.x学习笔记(一)Redis基础和数据类型

    前言

    最近学习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过程的笔记记录下来,跟大家一起学习。

  • 相关阅读:
    testNg vs junit 4.X @Test
    lombok+slf4j+logback SLF4J和Logback日志框架详解
    IntelliJ IDEA 当pom.xml更新时,自动加载pom.xml
    运算符重载具体解释
    设计模式之十八:桥接模式(Bridge)
    无限层级的组织机构
    实战Jquery(一)--username校验
    Android错误之--Error retrieving parent for item: No resource found that matches the given name 'Theme.A
    hibernate 缓存
    android --多线程下载
  • 原文地址:https://www.cnblogs.com/yflx/p/14773819.html
Copyright © 2011-2022 走看看