Redis简要

以前没有发现Redis有多么的重要,直到最近面试才觉得,把以前的材料翻出来做了简单总结

1. 关于关系型数据库和 nosql 数据库(键值对存储)
关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而 nosql 数据库是基于特殊的结构,并将数据存储到内存的数据库。从性能上而言,nosql 数据库要优于关系型数据库,从安全性上而言关系型数据库要优于 nosql 数据库,所以在实际开发中一个项目中 nosql 和关系型数据库会一起使用,达到性能和安全性的双保证。

2. Redis 简介 num
redis 是一个 key-value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和 hash(哈希类型)。为了保证效率,数据都是缓存在内存中,因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知综合性能最快的 Key-Value DB。
redis是单进程单线程的,采用多路 I/O 复用技术。
3. Linux 环境下 Redis 安装
官网:https://redis.io
下载:http://download.redis.io/releases
中文网:https://www.redis.net.cn/
官网提供安装方式如下:(安装 redis 编译的 c 环境,此步骤没有编译)
安装步骤:

1.把下载好的 redis-5.0.4.tar.gz 安装包拷贝到当前虚拟机 root 目录下,解压到/usr/local 下
[root@localhost ~]# tar -zxvf redis-5.0.4.tar.gz -C /usr/local

2.编译的 c 环境
[root@localhost ~]# yum install gcc-c++

3.进入redis-5.0.4目录 使用make命令编译redis(若报错,先make distclean,再make)
[root@localhost redis-5.0.4]# make

4.使用 make PREFIX=/usr/local/redis-5.0.4 install 命令安装(安装后会出现 bin 目录)
[root@localhost redis-5.0.4]# make PREFIX=/usr/local/redis-5.0.4 install

5.启动 redis 服务端(前台启动)
[root@localhost redis-5.0.4]# cd bin
[root@localhost bin]# ./redis-server
在这里插入图片描述
启动后看到如上欢迎页面,但此窗口不能关闭,窗口关闭就认为 redis 也关闭了,所以我们需
要在后台启动,然后再启动客户端进行连接,所以首先 Ctrl+C 退出。

解决:可以通过修改配置文件配置 redis 的后台启动(即服务器启动了但不会创建控制台窗口)
步骤如下:

1.切换到 redis-5.0.4 目录下,把当前目录下的 redis.conf 文件拷贝到 bin 目录下
[root@localhost bin]# cd …/
[root@localhost redis-5.0.4]# cp redis.conf bin/redis.conf

2.切换到 bin 目录下,修改 redis.conf 文件
[root@localhost redis-5.0.4]# cd bin
[root@localhost bin]# vim redis.conf

3.将 redis.conf 文件中的 daemonize 的值从 no 修改成 yes 表示后台启动
在这里插入图片描述

4.启动 redis 服务端(后台启动)
[root@localhost bin]# ./redis-server redis.conf

5.查看是否启动成功
[root@localhost bin]# ps -ef | grep redis

6.启动客户端
[root@localhost bin]# ./redis-cli

7.存取数据进行测试
127.0.0.1:6379> set name jack
OK
127.0.0.1:6379> get name
“jack”

4.Redis 的常用命令
redis 是一种高级的 key-value 的存储系统,其中的 key 是字符串类型,尽可能满足
如下几点:

1.key 不要太长,最好不要操作 1024 个字节,这不仅会消耗内存还会降低查找效率
2.key 不要太短,如果太短会降低 key 的可读性
3.在项目中,key 最好有一个统一的命名规范(根据企业的需求)

value 最常用的五种数据类型:
1.字符串(String)
2.列表(List)
3.集合(Set)
4.有序集合(sorted set)
5.哈希(Hash)

1.字符串(String)
set key value:设定 key 持有指定的字符串 value,如果该 key 存在则进行覆盖操作,总是返
回”OK”。

get key:获取 key 的 value。如果与该 key 关联的 value 不是 String 类型,redis 将返回错
误信息,因为 get 命令只能用于获取 String value,如果该 key 不存在,返回 null。

getset key value:先获取该 key 的值,然后在设置该 key 的值。

incr key:将指定的 key 的 value 原子性的递增 1.如果该 key 不存在,其初始值为 0,在 incr
之后其值为 1。如果 value 的值不能转成整型,如 hello,该操作将执行失败并返回相应的错
误信息。

decr key:将指定的 key 的 value 原子性的递减 1.如果该 key 不存在,其初始值为 0,在 incr
之后其值为-1。如果 value 的值不能转成整型,如 hello,该操作将执行失败并返回相应的错
误信息。

incrby key increment:将指定的 key 的 value 原子性增加 increment,如果该 key 不存在,
器初始值为 0,在 incrby 之后,该值为 increment。如果该值不能转成整型,如 hello 则失败
并返回错误信息。

decrby key decrement:将指定的 key 的 value 原子性减少 decrement,如果该 key 不存
在,器初始值为 0,在 decrby 之后,该值为 decrement。如果该值不能转成整型,如 hello
则失败并返回错

setex key seconds value:将值 value 关联到 key 并将 key 的过期时间设为 seconds(以
秒为单位)

append key value:如果该 key 存在,则在原有的 value 后追加该值;如果该 key 不存在,
则重新创建一个 key/value。

2.列表(List)

lpush key value1 value2…:在指定的 key 所关联的 list 的头部插入所有的 values,如果该
key 不存在,该命令在插入的之前创建一个与该 key 关联的空链 表,之后再向该链表的头
部插入数据。插入成功,返回元素的个数。

rpush key value1 value2…:在该 list 的尾部添加元素。

lrange key start end:获取链表中从 start 到 end 的元素的值,start、end 可为负数,若为1 则表示链表尾部的元素,-2 则表示倒数第二个,依次类推….

lpushx key value:仅当参数中指定的 key 存在时(如果与 key 管理的 list 中没有值时,则该
key 是不存在的)在指定的 key 所关联的 list 的头部插入 value。

rpushx key value:在该 list 的尾部添加元素。

lpop key:返回并弹出指定的 key 关联的链表中的第一个元素,即头部元素。

rpop key:从尾部弹出元素。

rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。

llen key:返回指定的 key 关联的链表中的元素的数量。

lset key index value:设置链表中的 index 的脚标的元素值,0 代表链表的头元素,-1 代表
链表的尾元素

3.集合(Set,不允许出现重复的元素)

sadd key value1 value2…:向 set 中添加数据,如果该 key 的值已有则不会重复添加。

smembers key:获取 set 中所有的成员。

scard key:获取 set 中成员的数量。

sismember key member:判断参数中指定的成员是否在该 set 中,1 表示存 在 , 0
表示不存在或者该 key 本身就不存在。

srem key member1 member2…:删除 set 中指定的成员。

4.有序集合(sorted set)

zadd key score member score2 member2 … :将所有成员以及该成员的分数存放到
sorted-set 中。

zcard key:获取集合中的成员数量。

zcount key min max:获取分数在[min,max]之间的成员。

zincrby key increment member:设置指定成员的增加的分数。

zrange key start end [withscores]:获取集合中脚标为 start-end 的成员,[withscores]参
数表明返回的成员包含其分数。

zrangebyscore key min max [withscores] [limit offset count]:返回分数在[min,max]的成
员并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]:offset,表明
从脚标为 offset 的元素开始并返回 count 个成员。

zrank key member:返回成员在集合中的位置。

zrem key member[member…]:移除集合中指定的成员,可以指定多个成员。

zscore key member:返回指定成员的分数。

5.哈希(Hash)

hset key field value:为指定的 key 设定 field/value 对(键值对)。

hgetall key:获取 key 中的所有 filed-vaule。

hmset key fields:设置 key 中的多个 filed/value。

hmget key fileds:获取 key 中的多个 filed 的值。

hexists key field:判断指定的 key 中的 filed 是否存在。

hlen key:获取 key 所包含的 field 的数量。

hincrby key field increment:设置 key 中 filed 的值增加 increment,如:age 增加 20。

5.Keys 的通用操作

keys patten:获取所有与 patten 匹配的 key,*表示任意字符,?表示一个字符。

del key1 key2…:删除指定的 key

renamel key newkey:为当前 key 重命名。

当然!最主要的还是Redis中的事务

6.Redis 中的事务
Redis 中的事务和 MySQL 中的事务有本质的区别,Redis 中的事务是一个单独的隔离操作,
事务中所有的命令都会序列化,按照顺序执行,事务在执行的过程中,不会被其他客户端发来
的命令所打断,因为 Redis 服务端是个单线程的架构,不同的 Client 虽然看似可以同时保持
连接,但发出去的命令是序列化执行的,这在通常的数据库理论下是最高级别的隔离。

Redis 中的事务的作用就是串联多个命令,防止别的命令插队。

常用命令:multi、exec、discard、watch、unwacth

当输入 multi 命令时,之后输入的命令都会被放在队列中,但不会执行,直到输入 exec 后,
Redis 会将队列中的命令依次执行,discard 用来撤销 Exec 之前被暂存的命令,并不是回滚。

watch/unwacth

在执行 multi 之前,先执行 watch key1 [key2…] ,watch 提供的乐观锁功能(初始时一个
版本号,exec 之后会更新当前版本号),在你 exec 的那一刻,如果被 watch 的键发生过改
动,则 multi 到 exec 之间的指令全部不执行。

watch 表示监控,相当于加锁,但在执行完 exec 时就会解锁。

unwacth 取消所有锁。

Redis 中的事务的特性总结

1.单独的隔离操作
事务中的所有命令都会序列化,然后按顺序执行,在执行过程中,不会被其他客户端
发送的命令打断。

2.没有隔离级别的概念
队列中的命令没有被提交之前都不会执行。

3.不能保证原子性
Redis 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,不会回滚。

7.Redis 中的持久化

Redis 有两种持久化方式:RDB 和 AOF

1.RDB(Redis DataBase)
将内存中的数据以快照的方式写入磁盘中,在 redis.conf 文件中,我们可以找到如下
配置:0在这里插入图片描述
在这里插入图片描述

save 900 1
save 300 10
save 60 10000
配置含义:
900 秒内,如果超过 1 个 key 被修改,则发起快照保存
300 秒内,如果超过 10 个 key 被修改,则发起快照保存
60 秒内,如果 1 万个 key 被修改,则发起快照保存

RDB 方式存储的数据会在 dump.rdb 文件中(在哪个目录启动 redis 服务端,该文件就会在
对应目录下生成),该文件不能查看,如需备份,对 Redis 操作完成之后,只需拷贝该文件即
可(Redis 服务端启动时会自动加载该文件)

2.AOF(Append Of File)

AOF 默认是不开启的,需要手动开启,同样是在 redis.conf 文件中开启,如下:

在这里插入图片描述
配置文件中的 appendonly 修改为 yes,开启 AOF 持久化。开启后,启动 redis 服务端,发
现多了一个 appendonly.aof 文件。

在这里插入图片描述
之后任何的操作都会保存在 appendonly.aof 文件中,可以进行查看,Redis 启动时会将
appendonly.aof 文件中的内容执行一遍。

如果 AOF 和 RDB 同时开启,系统会默认读取 AOF 的数据。

RDB 优点与缺点

优点
如果要进行大规模数据的恢复,RDB 方式要比 AOF 方式恢复速度要快。
RDB 是一个非常紧凑(compact)的文件,它保存了某个时间点的数据集,非常适合用作备份,同时也非常适合用作灾难性恢复,它只有一个文件,内容紧凑,通过备份原文件到本机外的其他主机上,一旦本机发生宕机,就能将备份文件复制到 redis 安装目录下,通过启用服务就能完成数据的恢复。

缺点
RDB 这种持久化方式不太适应对数据完整性要求严格的情况,因为,尽管我们可以用过修改快照实现持久化的频率,但是要持久化的数据是一段时间内的整个数据集的状态,如果在还没有触发快照时,本机就宕机了,那么对数据库所做的写操作就随之而消失了并没有持久化本地
dump.rdb 文件中。

AOF 优点与缺点

优点
AOF 有着多种持久化策略:
appendfsync always:每修改同步,每一次发生数据变更都会持久化到磁盘上,性能较差,但
数据完整性较好。

appendfsync everysec: 每秒同步,每秒内记录操作,异步操作,如果一秒内宕机,有数据
丢失。

appendfsync no:不同步。

AOF 文件是一个只进行追加操作的日志文件,对文件写入不需要进行 seek,即使在追加的过
程中,写入了不完整的命令(例如:磁盘已满),可以使用 redis-check-aof 工具可以修复这
种问题

Redis 可以在 AOF 文件变得过大时,会自动地在后台对 AOF 进行重写:重写后的新的 AOF
文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为 Redis 在
创建 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件中,即使在重写的过程中发生
宕机,现有的 AOF 文件也不会丢失。一旦新 AOF 文件创建完毕,Redis 就会从旧的 AOF 文
件切换到新的 AOF 文件,并对新的 AOF 文件进行追加操作。

缺点
对于相同的数据集来说,AOF 文件要比 RDB 文件大。
根据所使用的持久化策略来说,AOF 的速度要慢于 RDB。一般情况下,每秒同步策略效果较
好。不使用同步策略的情况下,AOF 与 RDB 速度一样快。

redis安装 1: 下载redis-5.0.4.tar.gz 2: 解压源码并进入目录 tar zxvf redis-5.0.4.tar.gz cd redis-5.0.4 3: 不用configure 4: 直接make (如果是32位机器 make 32bit) 查看linux机器是32位还是64位的方法:file /bin/ls 注:易碰到的问题,时间错误. 原因: 源码是官方configure过的,但官方configure时,生成的文件有时间戳信息, Make只能发生在configure之后, 如果你的虚拟机的时间不对,比如说是2012年 解决: date -s ' yyyy-mm-dd hh:mm:ss ' 重写时间 再 clock -w 写入cmos 5: 可选步骤: make test 测试编译情况 (可能出现: need tcl >8.4这种情况, yum -y install tcl ) 6: 安装到指定的目录,比如 /usr/local/redis make PREFIX=/usr/local/redis install 注: PREFIX要大写 7: 复制配置文件 cp redis.conf /usr/local/redis 注path为解压后的安装包路径 /root/gsj/redis-3.0.6 8: 让redis以后台进程的形式运行 vim /usr/local/redis/redis.conf 编辑redis.conf配置文件,修改如下内容; daemonize yes 9: make install之后,cd /usr/local/redis/bin得到如下几个文件 redis-benchmark 性能测试工具 redis-check-aof 日志文件检测工(比如断电造成日志损坏,可以检测并修复) redis-check-dump 快照文件检测工具,效果类上 redis-cli 客户端 redis-server 服务端 10: 启动与连接 启动redis并指定配置文件 cd /usr/local/redis ./bin/redis-server ./redis.conf #设置随机启动 vim /etc/rc.local 最后添加: /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf 连接: 用redis-cli cd /usr/local/redis/bin/ ./redis-cli #进入 exit /quit #退出 关闭redis pkill redis-server #关闭 ./redis-cli shutdown #关闭 查看是否启动成功 ps -ef | grep redis #查看端口是否占用 netstat -tunpl | grep 6379 11: 测试 String(字符串)类型: set name lijie #设置键name的值为lijie get name #获取name的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值