Redis入门学习
目录
1、先来认识一下redis
Redis是一个性能强劲速度非常快的非关系数据库,和传统的关系型数据库(如Mysql)不一样的是,mysql是以数据表的形式来存储数据,而redis是以键值的形式存储数据,它可以存储键(key)和5中不同类型的值(value)之间的映射,还可以将存储在内存中的键值数据持久化到硬盘,可以使用复制特性来提高“读”性能,还可以使用客户端分片来提高“写”性能。reids的读取速度是传统关系型数据读取速度的进200倍,Redis 的键值除了能存储字符串之外,还可以存储其他数据结构,这使得redis可以处理更为广泛的问题,reids可以作为主存储数据库使用也一个作为系统的辅助存储数据库使用,总之用好redis,我们就可以将redis扩展成一一个能够包含数百GB,每秒处理上百万此请求的系统
2、redis的数据持久化
reids是一种缓存服务器,那我们在使用redis的时候,首先要考虑一个问题,那就是当服务器关闭的时候数据,服务器中存储的数据改去哪里呢?redis有两种将数据持久化到硬盘的方法,RDB和AOF
2.1RDB
RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来,RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb,既然是快照,那就应该有一种触发机制来实现这个过程,对于RDB来说,提供了三种机制:save、bgsave、自动化。
- save触发方式.该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止,如果用户设置了save配置选项,例如 save 60 10000,那么就是从redis最后一次创建快照之后开始算起,当"60秒内有10000次写入" 时redis就会自动触发bgsave,如果用户设置了多个save配置选项,当任意一个save配置选项满足条件时redis就会自动触发bgsave
- bgsave触发方式,Redis会通过创建子进程的方式在后台异步进行快照操作,快照同时还可以响应客户端请求
- 通过redis的配置文件来实现自动触发
2.1.1RDB 的优势和劣势
①、优势
- RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
- 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
- RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
②、劣势
- RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。
- 当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子。进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。
2.2AOF
全量备份是非常消耗时间的,redis提供一种更加高效的方式AOF,工作机制很好理解,redis会将每一个收到的写命令都通过write函数追加到指定文件中。类似于记录日志
2.2.1文件重写
AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
AOF也有三种触发机制
- 每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
- 每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失
- 不同no:从不同步
3安装redis
1、上传redis安装包redis-4.0.8.tar.gz 到/app目录下
2、解压 tar xzvf redis-4.0.8.tar.gz
3、安装
cd redis-4.0.8
make
cd src
make install PREFIX=/usr/local/redis
4、移动配置文件到安装目录下
cd ../
mkdir /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
5将redis设置为后台启动
将reids.conf 中的daemonize no 改为 yes
6、启动redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 或者 ./redis-server &
7、停止redis
./redis-cli shutdown 或者 ps -ef|grep redis kill -9 进程号
4Redis的数据结构
redis可以存储键值和5中不同类型的之间的映射,5中数据结构类型如下表,
机构类型 | 结构存储的值 | 结构的读写能力 |
String | 可以是字符串、整数、浮点数 | 能够对字符串或者字符串的一部分进行操作,对整数或者浮点数进行自增或者自减的操作 |
List | 一个链表,链表上的每个节点都包含了一个字符串 | 可以从链表的两端推入或者弹出元素,读取单个或者多个元素,根据值查找或者移除元素 |
Set | 字符串的无序收集器,每个被包含的字符串都是独一无二的,各不相同的 | 添加获取移除多个元素,检查一个元素是否存在与集合中,还可以计算交集并集和差集,从集合里面随机获取元素 |
Hash | 包含键值对的无序散列表 | 可以添加获取移除单个键值对,获取所有键值对 |
ZSet | 字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定 | 可以添加获取删除单个元素;根据分值范围或者成员来获取元素 |
4.1redis中的字符串
redis中的字符串和其他编程语言中的字符串非常相似,字符串拥有和其他键值存储相似的命令,例如get(获取值)set(设置值)del(删除值),下面先来尝试一下这几个简单命令吧
命令 | 说明 |
GET | 获取指定建中的值 |
SET | 设置存储在指定建中的值 |
DEL | 删除存储在指定建中的值 |
INCR | INCR KEY-NAME 将建存储的值加上1 |
DECR | DECR KEY-NAME 将建存储的值减1 |
INCRBY | INCRBY KEY-NAME amount 将建存储的值加上整数amount |
DECRBY | DECRBY KEY-NAME amount 将建存储的值减去整数amount |
INCRBYFLOAT | INCRBYFLOAT KEY-NAME amount 将存储键的值加上浮点数amount---这个命令在redis2.6或以上版本可用 |
APPEND | APPEND key-name value 将value追加到指定键存储的值的末尾 |
GETRANGE | GETRANGE key-name start end 获取由偏移量start到end范围内所有的字符串 |
SETRANGE | SETRANGE key-name start value 从字符串start位置设置指定的值value |
[root@localhost bin]# ./redis-cli #登录reids
127.0.0.1:6379>
127.0.0.1:6379> set hello world #设置值 set成功后返回OK
OK
127.0.0.1:6379> get hello #获取值
"world"
127.0.0.1:6379> del hello #删除值 返回被删除值得数量
(integer) 1
127.0.0.1:6379> get hello
(nil) #获取不到值 返回一个nil
127.0.0.1:6379>
4.2redis中的列表
命令 | 说明 |
LPUSH | 将给定值推入列表左端 |
RPUSH | 将给定值推入列表右端 |
LPOP | 从列表左端弹出一个元素 |
RPOP | 从列表右端弹出一个元素 |
LINDEX | 获取列表指定位置上的一个元素 |
LRANGE | 获取列表在指定范围上的所有元素 |
LTRIM | LTRIM key-name start end,对列表进行修改,只保留从偏移量start到偏移量end范围内的元素, |
下面我们还是来实际操作一下吧
127.0.0.1:6379> rpush list-key item1
(integer) 1
127.0.0.1:6379> rpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item3
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1 #获取列表所有元素
1) "item1"
2) "item2"
3) "item3"
127.0.0.1:6379> lindex list-key 1
"item2"
127.0.0.1:6379> lpush list-key item0
(integer) 4
127.0.0.1:6379> lrange list-key 0 -1
1) "item0"
2) "item1"
3) "item2"
4) "item3"
127.0.0.1:6379> lpop list-key
"item0"
127.0.0.1:6379> lrange list-key 0 -1
1) "item1"
2) "item2"
3) "item3"
127.0.0.1:6379>
4.3redis的集合
redis的集合和列表都可以存储字符串,他们的区别在于,列表可以存储多个相同的字符串,而集合是通过使用散列表来保证存储的每个字符串都是不相同的,因为redis的集合使用无序的方式存储元素,所以用户不能像使用列表那样将元素推入集合的某一端或者中集合的莫一端弹出元素.
命令` | 说明 |
SADD | 将指定元素添加到集合 |
SMEMBERS | 返回集合包含的所有元素 |
SISMEMBERS | 检查指定元素是否存在集合中 |
SREM | 如果指定的元素在集合中存在,则删除改元素 |
SINTER | 交集 |
SUNION | 并集 |
SDIFF | 差集 |
SCARD | SCARD key-name 返回集合包含的元素的数量 |
下面还是来试试这几个命令
127.0.0.1:6379> sadd set-key item
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item3
(integer) 1
127.0.0.1:6379> sadd set-key item
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item3"
2) "item2"
3) "item"
127.0.0.1:6379> sismembers set-key item
(error) ERR unknown command 'sismembers'
127.0.0.1:6379> sismember set-key item
(integer) 1
127.0.0.1:6379> srem item
(error) ERR wrong number of arguments for 'srem' command
127.0.0.1:6379>
127.0.0.1:6379> srem set-key item
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> smembers set-key
1) "item3"
2) "item2"
127.0.0.1:6379>
4.4redis的散列(HASH)
redis的散列可以存储多个键值对之间的映射,和字符串一样,散列存储的值即可以是字符串也可以是数字
命令 | 说明 |
HSET | 在散列里面添加指定的键值对 |
HGET | 获取指定散列键的值 |
HGETALL | 获取散列李包含的所有键值对 |
HDEL | 如果指定的键值对在散列中存在,则删除这个元素 |
下面来试试这个几个命令吧
127.0.0.1:6379> hset hash-key key1 value1
(integer) 1
127.0.0.1:6379> hset hash-key key2 value2
(integer) 1
127.0.0.1:6379> hset hash-key key3 value3
(integer) 1
127.0.0.1:6379> hgetall hash-key
1) "key1"
2) "value1"
3) "key2"
4) "value2"
5) "key3"
6) "value3"
127.0.0.1:6379> hdel hash-key key1
(integer) 1
127.0.0.1:6379> hgetall hash-key
1) "key2"
2) "value2"
3) "key3"
4) "value3"
127.0.0.1:6379> hget hash-key key2
"value2"
127.0.0.1:6379>
4.5redis的有序集合(ZSET)
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复
命令 | 说明 |
ZADD | 将一个带有指定分值的成员添加到有序集合中 |
ZRANGE | 根据元素在有序集合中所处的位置,从有序集合中获取多个元素 |
ZRANGEBYSCORE | 获取有序集合在指定分值范围内的所有元素 |
ZREM | 如果指定成员存在与集合中,则删除这个成员 |
还是来动手试试这些命令吧
127.0.0.1:6379> zadd zset-key 1 member1
(integer) 1
127.0.0.1:6379> zadd zset-key 2 member2
(integer) 1
127.0.0.1:6379> zadd zset-key 3 member3
(integer) 1
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member1"
2) "1"
3) "member2"
4) "2"
5) "member3"
6) "3"
127.0.0.1:6379> zrange zset-key 0 10 withscores
1) "member1"
2) "1"
3) "member2"
4) "2"
5) "member3"
6) "3"
127.0.0.1:6379> zrem zset-key member1
(integer) 1
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member2"
2) "2"
3) "member3"
4) "3"
127.0.0.1:6379>
4.6键的过期时间
redis提供了用于为键设置过期时间的命令,以及查看键的过期时间的命令
命令 | 说明 |
PERSIST | PERSIST key0-name 移除键的过期时间 |
TTL | 查看指定键到过期时间还有多少秒 |
EXPIRE | EXPIRE key-name seconds 设置指定的键seconds秒后过期 |
PTTL | PTTL key-name 查看指定键到过期还有多少毫秒 |
PEXPIRE | PEXPIRE key-name seconds 设置指定的键到指定的毫秒后过期 |
5基本的redis事物
redis的基本事物,需要用到MULTI命令和EXEC命令,这种事物可以让一个reids客户端在不被其他客户端打断的情况下执行多个命令,和关系数据库的那种可以在执行的过程中回滚的事物不同,在redis里面,被MULTI和EXEC命令包含的所有命令会一个接一个的执行,直到所有的命令都执行完毕为止,当一个事物完毕后,reids才会处理其他客户端的命令
在reids里面执行事物,首先需要执行MULTI命令,然后输入我们想要在事物中执行的命令,最后在执行EXEC命令,到redis从一个客户端那里接收到MUTLI命令时,redis会将这个客户端之后发送的命令放到一个队列里面,知道这个客户端发送EXEC命令为止,redis就会在不被其他客户端打断的情况下,一个接一个的执行存储在队列里的命令,MUTLI和EXEC事物的一个主要作用就是移除竞争条件.
MULTI //开始事务
SET ... //命令1入队
GET ... //命令1入队
SADD ... //命令1入队
......
EXEC //执行事务(一次执行1.2.3...)