Redis初学

Redis简介

Redis:开源、免费、高性能、K-V数据库、内存数据库、非关系型数据库,支持持久化、集群和事务

Redis安装及配置

1、Linux安装

确保Linux已经安装gcc
z这里我是用FileZilla软件,将本地下好的redis包导入虚拟机,并安装。
解压

tar -zxvf redis-3.0.4.tar.gz

进入目录后编译

cd redis-3.0.4

安装

make 

2、Redis配置

进入/目录 cd /
创建文件夹 mkdir myredis

进入解压的Redis目录,
将redis.conf复制到安装文件的目录下

cp redis.config /myredis

启动自定义配置的Redis
先到目录/usr/local/bin/

redis-server /myredis/redis.config
redis-cli -p 6379

daemonize:如需要在后台运行,把该项的值改为yes

3、关闭

SHUTDOWN
exit

Redis常用命令

select 切换数据库 默认16个
dbsize查看当前数据库key的数量
FLUSHDB删除当前库内容

Redis常见数据类型

Key

key的命名建议
key不要太长,尽量不要超过1024字节。不仅消耗内存,也会降低查找的效率
key不要太短,太短可读性会降低
在一个项目中,key最好使用统一的命名模式,如user:123:password
key区分大小写
常用命令
exists key的名字 判断某个key是否存在,存在为1否则为0
move key db 移动key到另一个数据库,相当于剪切复制
get key 返回对应的值
expire key秒钟:为给定的key设置过期时间
ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
type key 查看你的key是什么类型
keys * 查看
加key 使用set k1 v1 如果已经存在会覆盖值

EXPIRE key second的使用场景:
1、限时的优惠活动
2、网站数据缓存
3、手机验证码
4、限制网站访客频率

string

string类型是二进制安全的,redis的string可以包含任何数据,如图像、序列化对象。一个键最多能存储512MB。二进制安全是指,在传输数据的时候,能保证二进制数据的信息安全,也就是不会被篡改、破译;如果被攻击,能够及时检测出来

set/get/del/append/strlen 说一下append和strlen,和java中String用法一样,append合并附加字符串,strlen是查看长度
Incr/decr/incrby/decrby 一定要是数字才能进行加减
incr k2 加一
decr k2 减一
incrby k2 10 加10

getrange/setrange
getrange:获取指定区间范围内的值,类似between…and的关系
从零到负一表示全部

getrange key5 0 -1

set range设置指定区间范围内的值,格式是setrange key值 具体值
setrange key5 1 xxx 把对应位置开始三个元素换成xxx

setex(set with expire)健秒值/setnx(set if not exist)
setnx k1 v11如果k1已存在,则失效 返回0;不存在,则正常社设置值。返回1

mset/mget/msetnx
同时设置/获取多个值

mset k1 v1 k2 v2 k3 v3
mget k1 k2 k3
msetnx k3 v4 k4 v4设置一个存在,一个不存在的值,会失败返回0

getset(先get再set)

String应用场景:

1、String通常用于保存单个字符串或JSON字符串数据
2、因为String是二进制安全的,所以可以把保密要求高的图片文件内容作为字符串来存储
3、计数器:常规Key-Value缓存应用,如微博数、粉丝数。INCR本身就具有原子性特性,所以不会有线程安全问题

list

类似于Java中的LinkedList。
常用命令
lpush/rpush/lrange

lpush list01 12345 相当于栈
range list01 0 -1 查看时先进后出
rpush list02 12345 相当于队列 先进先出

lpop/rpop

lpop list01 相当于弹出栈顶 答案是5
rpop list01 相当于访问队尾 答案是1

lindex 按照索引下标获得元素(从上到下)

lindex lis01 2 返回2,下标从零开始计算

llen长度

llen list01 结果为3

lrem key 删N个value

lrem list03 2 3删除两个3

ltrim key 开始index 结束index, 截取治党范围的值后再赋给key

lpush list1 0 1 2 3 4 5 6 7 8 9
ltrim list1 3 5
结果6 5 4

rpoplpush源列表 目的列表

rpoplpush list1 list2 从list1队尾拿出一个元素放到list2的栈顶

lset key idex value

lset list01 1 x 把下标为1的元素置为x

linsert key before/after 值1 值2

linsert list01 before x java 在该值前插入一个java值

应用场景


1、对数据大的集合数据删减
		列表显示、关注列表、粉丝列表、留言评价...分页、热点新闻等
2、任务队列
		list通常用来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样通过order by来排序

set

唯一、无序
sadd/smembers/sismember

sadd set01 1 1 2 2 3 3 只会插入123
smembers set01 0 -1查看全部
sismember set01 1 判断1是否在其中 在返回1

scard获取集合里面的元素个数

scard set01

srem key value删除集合中元素

srem set01 3 删除3

srandmember key 某个整数(随机出几个数字)

srandmember set 3 随机访问3个数字,每次不同

spop key随机出栈

spop set01 随机出栈一个元素

smove key1 key2在key1里某个值 作用是将key1里的某个值赋给key2

smove set01 set02 5 把set01中的5赋给set02的队尾

差集sdiff 取出元素在第一个集合里,不在第二个集合里
交集sinter 共同的
并集sunion 合并

应用场景

对两个集合间的数据[计算]进行交集、并集、差集运算
1、以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。
2、利用唯一性,可以统计访问网站的所有独立 IP

hash

Redis hash是一个string类型的field和value的映射表,hash特别适用于存储对象。每个hash可以存储232-1键值对。可以看成KEY和VALUE的MAP容器。相比于JSON,hash占用很少的内存空间。

KV模式不变,但V是一个键值对
常用命令
hset/hget/hmset/hmget/hgetall/hdel 存取
hlen 个数
hexists key 在key里面的某个值的key
hkeys/hvals 查看
hincrby/hincrbyfloat 加 整数/小数
hsetnx 存在不放,不存在就放

hset user id 11 vallue是id 11,但id同时也是一个key
get user id
hmset customer id 11 name lisi age 26 设置多个属性
hmget customer id name age
hgetall customer同上
hdel user id 删除
hlen customer 返回3,查看个数
hexists customer id 存在返回1
hkeys customer 查看所有key
hvals customer 查看所有value
hincrby customer age 2 年龄加2

应用场景

Hash的应用场景,通常用来存储一个用户信息的对象数据。
1、相比于存储对象的string类型的json串,json串修改单个属性需要将整个值取出来。而hash不需要。
2、相比于多个key-value存储对象,hash节省了很多内存空间
3、如果hash的属性值被删除完,那么hash的key也会被redis删除

zset

有序且不重复。每个元素都会关联一个double类型的分数,Redis通过分数进行从小到大的排序。分数可以重复
在set基础上,加一个score值。
之前set是k1 v1 v2 v3,
现在zset是k1 score1 v1 score2 v2

应用场景

1、如推特可以以发表时间作为score来存储
2、存储成绩
3、还可以用zset来做带权重的队列,让重要的任务先执行

zadd/zrange
zrangebyscore key 开始score 结束score (表示不包含
zrem key 某score下对应的value值,作用是删除元素

zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset01 0 -1 查看所有 结果v1到v5
zrange zset01 0 -1 withscores 带score值
zrangebyscore zset01 60 90 显示v1 v2 v3 v4
zrangebyscore zset01 (60 (90 显示v2 v3
zrangebyscore zset01 60 90 limit 2 2 从返回结果的2里面截取两个
zrem zset01 v5

zcard/zcount key score区间/zrank key values值,作用是获得下标值/zscore key对应值,获得分数
zrevrank key values值,作用是逆序获得下标值
zrevrange
zrevrangebyscore key

zcard zset01 返回5 查看个数
zcount zset01 60 80 返回3个 查看区间
zrank zset01 v4 返回3 查看下标
zscore zset01 v4 返回90 查看分数
zrevrank zset01 v4 返回1
zrevrange zset01 0 -1 逆序查看所有value值
zrevrangebyscore zset01 90 60 返回 v4 v3 v2 v1

Redis安全设置

参数说明
redis.conf 配置项说明如下:

  1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    daemonize no

  2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
    pidfile /var/run/redis.pid

  3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
    port 6379

  4. 绑定的主机地址
    bind 127.0.0.1
    5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
    timeout 300

  5. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
    loglevel verbose

  6. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
    logfile stdout

  7. 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
    databases 16

  8. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
    save
    Redis默认配置文件中提供了三个条件:
    save 900 1
    save 300 10
    save 60 10000
    分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

  9. 指定本地数据库文件名,默认值为dump.rdb
    dbfilename dump.rdb

  10. 指定本地数据库存放目录
    dir ./

  11. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
    slaveof

  12. 当master服务设置了密码保护时,slav服务连接master的密码
    masterauth

  13. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭
    requirepass foobared

  14. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
    appendonly no

  15. 指定更新日志文件名,默认为appendonly.aof
    appendfilename appendonly.aof

Redis的持久化

包括RDB(Redis DataBase)和AOF(Append Only File)。

RDB

1、是什么?

在指定的时间间隔内将内存中的数据集快照写入磁盘,
也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到
一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方
式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

2、Fork

fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)
数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

3、rdb 保存的是dump.rdb文件

4、如何触发RDB快照

1)配置文件中默认的快照配置

RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件,
默认
是1分钟内改了1万次,
或5分钟内改了10次,
或15分钟内改了1次。 即会生成rdb文件

2)命令save或者是bgsave 立刻备份,不用满足默认修改条件

save时只管保存,其它不管,全部阻塞。 如果想禁用RDB持久化的策略,只要不设置任何save指令,或者给save传入一个空字符串
参数也可以 BGSAVE:Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求。可以通过lastsave
命令获取最后一次成功执行快照的时间。

3)执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义

5、如何恢复

将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务
CONFIG GET dir获取目录

6、优势和劣势

适合大规模的数据恢复 对数据完整性和一致性要求不高。

在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改;
Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

7、如何停止

动态所有停止RDB保存规则的方法:redis-cli config set save “”

AOF(Append Only File)

1、是什么?

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),
只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

2、Aof保存的是appendonly.aof文件

3、配置位置

打开redis.conf 将appendonly no 改为yes

4、正常恢复和异常恢复

将有数据的aof文件复制一份保存到对应目录(config get dir)
恢复:重启redis然后重新加载

备份被写坏的AOF文件
Redis-check-aof --fix进行修复
恢复:重启redis然后重新加载

5、优势和劣势

1)每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
2)每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失
3) 不同步:appendfsync no 从不同步

  1. 相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb
  2. Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

总结:

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储;

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些
命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.
Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大

只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.;

同时开启两种持久化方式:在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份),
快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

Redis的事务

1、是什么?

可以一次执行多个命令,本质是一组命令的集合。一个事务中的
所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

2、能干嘛?

一个队列中,一次性、顺序性、排他性的执行一系列命令

3、怎么玩?
常用指令
在这里插入图片描述
Case1:正常执行
在这里插入图片描述
Case2:放弃事务
在这里插入图片描述
Case3:全体连坐
在这里插入图片描述
Case4:冤头债主
在这里插入图片描述
这里注意与上面不同的地方是,相当于一个是编译期异常,一个是运行期异常。

Case5:watch监控
悲观锁/乐观锁/CAS(Check And Set)

悲观锁(Pessimistic Lock),
顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,

乐观锁策略:提交版本必须大于记录当前版本才能执行更新

1、初始化信用卡可用余额和欠额
在这里插入图片描述
2、无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内
在这里插入图片描述
3、有加塞篡改
在这里插入图片描述
解释:watch机制类似于乐观锁,一旦发现其他人要改动数据,则本次事务提交全部失败,以别人改动的数据为准。

4、unwatch
在这里插入图片描述
如果在unwatch的情况下,事务提交时即使有人修改也没事,仍然按照事务的提交数据为准。

5、一旦执行了exec之前加的监控锁都会被取消掉了

小结:
Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。
通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,
EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败

Redis的复制(Master/Slave) 主从复制

1、是什么?

行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,
自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。

2、能干嘛?
读写分离
容灾恢复

3、怎么玩
1)配从(库)不配主(库)
2)从库配置:slaveof 主库IP 主库端口

每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件
Info replication 查看当前库的主从关系

3)修改配置文件细节操作
拷贝多个redis.conf文件
开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字

4)常用3招
一主二仆
初始化
在这里插入图片描述
一个Master两个Slave
在这里插入图片描述
主从问题演示:
*1 切入点问题?slave1、slave2是从头开始复制还是从切入点开始复制?比如从k4进来,那之前的123是否也可以复制

可以复制。

2 从机是否可以写?set可否?

不能写。只读

3 主机shutdown后情况如何?从机是上位还是原地待命

原地待命。

4 主机又回来了后,主机新增记录,从机还能否顺利复制?

可以。

5 其中一台从机down后情况如何?依照原有它能跟上大部队吗?

不能,变为master了。*

薪火相传
1、上一个Slave可以是下一个slave的Master,Slave同样可以接收其他
slaves的连接和同步请求,那么该slave作为了链条中下一个的master,
可以有效减轻master的写压力
2、中途变更转向:会清除之前的数据,重新建立拷贝最新的
3、Slaveof 新主库IP 新主库端口

反客为主
SLAVEOF no one
使当前数据库停止与其他数据库的同步,转成主数据库

4、复制原理
在这里插入图片描述
5、哨兵模式
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

使用步骤
在这里插入图片描述
配置内容
在这里插入图片描述
启动哨兵在这里插入图片描述
让原有的master挂掉
在这里插入图片描述
自动投票新选
在这里插入图片描述
重新主从继续开工,info replication查查看
这时80端口自动胜出。反客为主
在这里插入图片描述
问题:如果之前的master重启回来,会不会双master冲突?
不会,反而会成为奴隶
在这里插入图片描述
缺点

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

记录本地eclipse连接虚拟机centos6.5遇到的问题

1、导入jar包
在这里插入图片描述
2、桥接模式即可,ifconfig记录虚拟机的ip
3、关闭虚拟机防火墙
4、保险起见,将redis服务添加到防火墙允许命令里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值