Redis基础了解

一、Redis的简介

1. 什么是Redis

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的 key-value数据库。

2.Redis有什么特点

  • Redis支持数据的持久化,AOF日志和RDB快照。
  • 性能极高,Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 支持多种数据类型, Redis有8种数据类型,当然常用的主要是 String、Hash、List、Set、 SortSet 这5种类型,他们都是基于键值的方式组织数据。
  • Redis支持数据的备份,即master-slave模式的主从复制。
  • 功能丰富,可设置键过期、基于发布订阅可实现简单的消息队列。等等。

3.适用场景

  • 海量数据的读写
  • 高并发数据的读写
  • 对数据拓展要求高的数据

说一个很多人都说的场景,例如某个网站非常火热,一天的访问次数有100万次。其中首页的某条数据接下来的一天都不会改变,如果没有使用redis之类的。数据库就会被执行100万次查的操作,可能会崩掉。使用redis做缓存之后,只需第一次查询,然后将结果保存在redis。后面的如果再访问,直接拿去用就可以了,及大程度的降低了数据库IO的读写。

4.redis 默认打开16个数据库,从0到15编号

二、Redis的数据结构

1、Redis常用的五个数据结构

1.String(字符串类型)
2.Hash(哈希类型)
3.List(列表类型)
4.Set(集合类型)
5.SortSet(有序集合类型)

2、String类型

将字符串值 value 关联到 key 。如果 key 已经持有其他值, SET 就覆写旧值,无视类型。

2.1 创建一个key
语法:set key value [ex 秒数] / [px 毫秒数]
列子:set username tom ex 10    
注意:ex和px后面跟的是该数据存在的有效时间,写一个就可以了。如果两个都写了,以写在后面的那个为准!
2.3 一次性创建多个key
语法:mset key1 value1 key2 value2 ....
2.4 获取key的值及一次获取多个key的值
1.获取单个key的值:get key
2.获取多个key的值:mget key1 key2 key3
2.5 删除key
语法:del key
2.6 查看所有的key
语法:keys *
2.7 将key的值加1,将key的值减1
将key的值加1:
语法:incr key
作用:将指定key的值加1,并返回加1后的值!

将key的值减1:
语法:decr key
作用:将指定key的值减1,并返回减1后的值!
    
注意:如果key中的值为小数,使用此命令会报错!
2.8 将key的值加上给定的值,将key的值减去给定的值
将key的值加上给定的值:
语法:incrby key number
作用:将指定的key的值加上给定的值,并返回增加后的值
注:number:要增加的值
    
将key的值减去给定的值:
语法:decrby key decrement
作用:将指定的key的值减去给定的值,并返回减去后的值
注:decrement:要减去的值
2.9 将key的值加上给定的浮点值
语法:incrbyfloat key floatnumber
作用:将指定的key的值加上给定的浮点值,并返回增加后的值
注:floatnumber是自己准备要增加的浮点值

3、Hash类型

hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

3.1 创建key
语法:hset key field value
示意: hset key(Hash名称)  field(键的名称)  value(值)
3.2 获取Hash中保存的值
语法:hget key field 
示意:hget key(Hash名称)  field(键的名称)  
3.3 获取Hash中保存的全部的键和值
语法:hgetall key
示意:hgetall key(Hash名称)
3.4 删除Hash中的键值
语法:hdel key field
示意:hdel key(Hash名称)  field(键的名称)  

4、List类型

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

4.1添加元素到List
添加元素到列表的头部(左边)
语法:lpush key value
示意:lpush List的名称  值
 
添加元素到列表的尾部(右边)
语法:rpush key value
示意:rpush List的名称  值
4.2 获取List中的元素
语法:lrange key start end
示意:lrange  key(list名称)   start(起始下标)   end(结束下标)

补充:end=-1  ,表示查看所有元素!

4.3 删除元素
语法:lpop key
示意:lpop key(list名称)
作用:删除列表最左边的元素,并返回元素
    
语法:rpop key
示意:rpop key(list名称)
作用:删除列表最右边的元素,并返回元素

5、Set类型

在list中是允许保存重复的元素的,因为没有键,当元素重复后就搞不清楚哪个值是需要的

​ Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

5.1 添加元素到Set集合
语法:sadd key value
示意:sadd key(set集合名称) value(值)
5.2 获取Set中的元素
语法:smembers key
示意:smembers key(set集合名称)
作用:获取set集合中的全部元素
5.3 在集合中删除指定的元素
语法:srem key value
示意:srem key(set集合的名称) value(要删除的元素)

6、Sorted set类型

Sorted set有序集合,和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

6.1添加元素到Sorted set
语法:zadd key score value
示意:zadd key(Sorted set集合的名称) score(这个分数可以随便给) value(值)
6.2 获取元素
语法:zrange key start end [withscores]
示意:zrange key(Sorted set集合的名称) start(开始的下标) end(结束的下标)
注意:打印的顺序是根据分数从小到大排列的

补充:后面加 withscores 表示查看集合中的元素,并且查看分数!

6.3 删除元素
语法:zrem key value
示意:zrem key(集合的名称) value(要删除的元素)

三、Redis通用key的命令

1.查看所有的key
语法:keys *
2.删除一个或者多个key
语法:del key //删除一个
语法:del key1 key2 ....//删除多个
3.修改key的名称
语法:rename key newkey
示意:rename key(被修改key的名称) value(新名称)

注:如果newkey已存在,则newkey的原值被覆盖

4.查询相应key

在redis里,允许模糊查询key,有3个通配符 *, ? ,[]
    *: 通配任意多个字符
    ?: 通配单个字符
    []: 通配括号内的某1个字符
语法:keys 查询的条件
例子:keys A*   //查询A开头的key
     keys ??? //查询只有3个字符的key
     keys A[bdc] //查询以A开头,以括号内任意一个字符结尾的key
5. 随机返回一个key
语法:randomkey 
6. 判断key是否存在
语法:exists key
7.判断key的类型
语法:type key
8.查询key的生命周期
语法:ttl key
作用: 查询key的生命周期
返回: 秒数
注:对于不存在的key或已过期的key/不存在的key,都返回-1。Redis2.8中,对于不存在的key,返回-2
9. 切换数据库和移动键到其它数据库
9.1 切换数据库
语法:select db
示意:select db(数据库编号)
注意:切换到数据库后,之前保存的数据都没有了(redis默认使用0号数据库)
9.2 将一个数据库的key复制到另一个数据库
语法:move  key db
示意:move  key(要复制的key) db(目标数据库)
10 .设置key的有效期(默认永久有效)
语法:expire key num
示意:expire key num(整形值,以秒为单位)
10.1 设置key永久有效
语法:persist key
10.2 设置key的生命周期
语法:pexpire key num
示意:pexpire key num(毫秒数)
10.3 查看key的生命周期
语法:pttl  key
11. 刷新数据库
语法:flushdb
作用:执行刷新数据库操作后,redis中保存的数据将会被清空。

四、Redis持久化的两种方式

1.RDB持久化

RDB的工作原理:每隔N分钟或N次写操作后,从内存dump数据形成rdb文件。然后放在指定目录。

更改编辑redis.conf配置文件来实现RDB持久化

设置redis.conf配置文件中的RDB快照相关参数:
    save 900 1    #刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后至少1个关键字发生变化。
    save 300 10  #必须是300秒之后至少10个关键字发生变化。
    save 60 10000 #必须是60秒之后至少10000个关键字发生变化。
    上面三个参数屏闭后,rdb方式就关闭了
    stop-writes-on-bgsave-error yes    #后台存储错误停止写。
    rdbcompression yes    #使用LZF压缩rdb文件。
    rdbchecksum yes    #存储和加载rdb文件时校验。
    dbfilename dump.rdb    #设置rdb文件名。
    dir ./    #设置工作目录,rdb文件会写入该目录。

注意:在Linux修改配置文件,先拷贝一份再修改。修改拷贝的那一份!

由于修改过redis.conf,我们启动redis的时候还要加上配置文件的所在路径

启动服务端的语法:
    启动程序所在的路径  配置文件所在的路径       //中间用空格隔开

RDB持久化的弊端:在2个保存点之间,断电,将会丢失1-N分钟的数据。

2.AOF日志持久化

AOF的工作原理: 以独立日志的方式记录每次写命令,并在 Redis 重启时在重新执行 AOF 文件中的命令以达到恢 复数据的目的 。

更改编辑redis.conf配置文件来实现AOF日志持久化

AOF日志相关参数:
    appendonly no # 是否打开 aof日志功能
    appendfsync always   # 每1个命令,都立即同步到aof. 安全,速度慢
                everysec # 折衷方案,每秒写1次
                no  #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快。

    no-appendfsync-on-rewrite  yes # 正在导出rdb快照的过程中,要不要停止同步aof
3.关于AOF日志重写

因为 AOF 持久化是通过保存被执行的写命令来记录 Redis 状态的,所以随着 Redis 长时间运行,AOF 文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的 AOF 文件很可能对 Redis 甚至宿主计算机造成影响。

为了解决 AOF 文件体积膨胀的问题,Redis 提供了 AOF 文件重写( rewrite) 功能。通过该功能,Redis 可以创建一个新的 AOF 文件来替代现有的 AOF 文件。新旧两个 AOF 文件所保存的 Redis 状态相同,但是新的 AOF 文件不会包含任何浪费空间的命令,所以新 AOF 文件的体积通常比旧 AOF 文件的体积要小得很多。(这段是从 https://www.cnblogs.com/remcarpediem/p/11644722.html 博主那里看到的,感觉我自己来描述的话,不见得比这清楚。感谢博主!建议了解更清楚的话还是看看其它博主的,本篇只是说明基本的使用!)

更改编辑redis.conf配置文件

配置AOF重写的相关参数:
    auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
    auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写

五、Redis中的事务

对比Mysql和Redis的事务

MySQL Redis
开启 start transaction multi
语句 普通SQL 普通命令
失败 rollback 回滚 discard 取消
成功 commit exec

Redis事务的exec命令和MySQL中commit命令的区别

Redis中:

multi命令开启事务后,命令只是加入队列并没有开始执行。当执行exec命令后会出现两种情况,①命令全部不执行,②执行部分命令(只执行正确的命令,自动跳过错误的命令!)

MySQL中:

MySQL中开启事务后,要么成功 命令全部执行,要么失败 命令全部不执行!

Redis事务的discard命令和MySQL中rollback命令的区别

Redis中:

在exec命令提交后,discard只是取消这个事务的执行,放弃事务块内命令的执行。如果出现了只执行部分命令的情况,此时discard取消,事务并不会回滚,正确命令造成的影响仍然存在!

MySQL中:

MySQL的rollback命令只会在commit成功后执行,执行后语句造成的影响全部消失!

5.1 事务监听watch指令

Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,
比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行

语法:watch key

猜你喜欢

转载自www.cnblogs.com/whitespaces/p/11831504.html