redis.docx

上传人:b****3 文档编号:11614041 上传时间:2023-06-01 格式:DOCX 页数:15 大小:115.87KB
下载 相关 举报
redis.docx_第1页
第1页 / 共15页
redis.docx_第2页
第2页 / 共15页
redis.docx_第3页
第3页 / 共15页
redis.docx_第4页
第4页 / 共15页
redis.docx_第5页
第5页 / 共15页
redis.docx_第6页
第6页 / 共15页
redis.docx_第7页
第7页 / 共15页
redis.docx_第8页
第8页 / 共15页
redis.docx_第9页
第9页 / 共15页
redis.docx_第10页
第10页 / 共15页
redis.docx_第11页
第11页 / 共15页
redis.docx_第12页
第12页 / 共15页
redis.docx_第13页
第13页 / 共15页
redis.docx_第14页
第14页 / 共15页
redis.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

redis.docx

《redis.docx》由会员分享,可在线阅读,更多相关《redis.docx(15页珍藏版)》请在冰点文库上搜索。

redis.docx

redis

安装

建议redis安装在Linux环境下,所以要特别要注意在Linux环境下安装redis的步骤。

Redis的作用

缓存

任务队列

应用排行榜

网站访问统计

数据过期处理

分布式集群架构中的session分离

Jedis的使用(单连接和连接池)

Jedis时官网推荐的redis开发包。

Redis支持的数据类型

字符串类型

列表类型

有序集合类型

散列类型

集合类型

Redis的连接和关闭

直接在Windows下的客户端连接:

如果没密码就去掉-a后面的部分。

代码连接和关闭——短链接:

代码连接——连接池:

打开连接池

关闭连接池

连接jedis

关闭jedis

Redis数据结构

①Key的定义:

1.不要过长,最好不要超过1024字节,因为太长了不仅占用内存,而且会降低查询速度;

2.不要太短,因为太短了会降低key的可读性;

3.最好有统一的命名规范。

②存储String

1.二进制安全的,写入和获取的数据相同;

2.Value最多可容纳的数据长度为512M;

存储String常用的命令:

赋值set,如setnameliuqian

取值get,如getname

先取值再赋值getset,如getsetnamewangguan

删除del,如delname

数值增减

incrnum意思时如果数据库中没有数字num则创建一个并赋初值为0再加上1,结果就是1,如果数据库中已经有数字num,则执行incrnum之后会自动再之前num值的基础上加1

decrnum意思是如果数据库中没有数字num则创建一个并赋初值0再减去1,结果就是-1,如果数据库中已存在数字num,则执行decr之后num值会自动减1

扩展命令

incrbykeyvalue意思是再之前key值的基础上加上value,如incrbynum5表示把num值加上5,如果数据库中不存在,那么创建num并赋初值为0再加上5

decrby与incrby用法一模一样,但效果正好相反

③存储Hash

1.是StringKey和StringValue的Map容器;

2.每个Hash可以存储4294967295个键值对;

存储Hash常用的命令:

赋值hset/hmset,hset一次存放一个键值对,hmset一次可存放多个键值对

如hsetmyhashusernameliuqian表示给myhash中放username是liuqian的键值对

hsetmyhashage20表示给myhash中放age是20的键值对

如hmsetmyhash1usernameliuqianage20表示给myhash1中一次存放username是liuqian以及age是20的两个键值对

取值hget/hmget/hgetall,hget一次取一个键值对的值,hmget一次可取多个键值对的值,使用hset存储的值也可以用hmget拿出来,当然使用hmset存储的值也可以使用hget拿出来,hgetall会将一个hash中所有的属性和属性值全都拿出来

如hgetmyhashusername表示从myhash中拿出username的值

hmgetmyhashusernameage表示从myhash中拿出username和age的值

hgetallmyhash表示从myhash中拿出所有的属性和属性值

删除hdel/del,hdel删除后面跟的属性,del则删除整个集合(del是个通用的命令)

如hdelmyhashusernameage表示删除myhash中的username和age键值对

delmyhash表示删除整个myhash

增加数字hincrby,如hincrbymyhashage5表示将myhash中age属性加5,如果没有age属性则会新增age属性赋初值为0再加5

自学命令hexists/hlen/hkeys/hvals,

如hexistsmyhashusername表示查询myhash中username属性是否存在,若存在返回1,否则返回0

hlenmyhash表示查询myhash中属性的个数

hkeysmyhash表示查询myhash中所有的属性

hvalsmyhash表示查询myhash中所有的值

④存储List

1.ArrayList使用数组方式存储,所以使用索引查询速度比较快,但新增和删除的时候需要进行移位,所以新增和删除比较慢;

2.LinkedList使用双向链表的方式存储,因为每个指针都记住了前后元素的指针,所以再新增和删除的时候只需要改变指针指向即可,所以新增和删除比较快,但查询比较慢;

3.双向链表中添加数据;

4.双向链表中删除数据;

存储List常用的命令:

两端添加lpush/rpush:

分别代表从左侧添加和从右侧添加(先加进去的在右侧)

如lpustmylist123表示从左侧向mylist中添加1/2/3三个元素,添加后从左到右的顺序依次是321

lpushabc表示从左侧向mylist中添加a/b/c三个元素,添加后从左到右的顺序依次为cba321

rpushmylist456表示从右侧向mylist中添加456三个元素,添加后的顺序依次为cba321456

查看列表lrange:

如lrangemylist08表示查询mylist中第0到第8个元素

lrangemylist0-1表示查询mylist中第0到倒数第一个元素结束

lrangemylist0-n表示查询mylist中第n到倒数第一个元素结束

两端弹出lpop/rpop:

分别表示从左侧弹出和从右侧弹出

如lpopmylist表示从左侧弹出mylist的元素,直接效果就是返回mylist最左侧的一个元素并将该元素从mylist中移除

rpopmylist表示从右侧弹出mylist的元素,直接效果就是返回mylist最右侧的一个元素并将该元素从mylist中移除

获取列表中元素个数llen:

如llenmylist表示查询mylist中元素的个数

扩展命令lpushx/rpushx/lrem/lset/linsert/rpoplpush/:

如lpushxmylistX表示只有当mylist存在的时候才给mylist头部插入X这个元素,否则不会创建mylist的

rpushxmylistX表示只有当mylist存在的时候才给mylist尾部插入X这个元素

lremmylist2M表示从左到右删除mylist中的2个M元素

lremmylist-2M表示从右到左删除mylist中的2个M元素

lremmylist0M表示删除mylist中的所有M元素

lsetmylist3A表示在mylist的第三个角标的位置插入A元素

linsertmylistbefore/afterb11表示在mylist的b元素之前/之后插入11元素

rpoplpushmylist2mylist3表示将mylist2尾部的元素弹出并添加到mylist3的头部

rpoplpush的应用场景:

redis经常作为消息队列的服务来完成多个程序之间消息的交互,假设一个程序正在使用lpush向链表中添加元素(即为生产者),另外一个程序正在执行rpop从列表中去除元素(消费者),消费者程序在取出元素后立刻崩溃,由于该已经被取出且未被正常处理,那么我们就可以认为这个消息已经丢失了,由此可能会导致业务数据的丢失或者业务状态的不一致等现象的发生。

这时可以通过rpoplpush这个命令让消费者程序子主消息队列中取出元素之后,再将该元素插入到备份的队列当中,直到消费者程序完成正常的逻辑处理后再将消息从备份队列中删除,这样我们可以提供一个守护的线程,当发现备份队列中的消息过期的时候可以重新将它放回到主消息的队列当中,以便其他的消费者可以继续处理。

 

⑤存储Set

1.和List不同的是,Set集合中不允许出现重复的元素,与Java中的完全相同;

2.因为Set会在服务器端计算多个set之间的差集/交集和并集运算,因此操作效率非常高,可以节省大量的网络开销;

3.每个set可以包含的最大元素数量为4294967295个;

储存Set常用的命令:

添加元素sadd:

saddmysetabc表示向myset集合中添加a/b/c三个元素

删除元素srem:

sremmysetab表示删除myset集合中的a/b元素

获得元素smembers/sismember:

smembersmyset表示获取myset集合中的所有元素

sismembermysetaaa表示查询myset集合中aaa元素是否存在,若存在则返回1,否则返回0

集合中的差集运算sdiff:

(运算后的结果是乱序的)

特别注意:

sdiff运算与集合的前后顺序有关,加入添加如下两个集合

saddset1abcdef

saddset21a2b3cd45

进行差集运算

sdiffset1set2的结果是ef

sdiffset2set1的结果是12345

集合中的交集运算sinter:

(运算后的结果是乱序的)

还是上面两个集合

sinterset1set2和sinterset2set1的结果一样,都是abcd

集合中的并集运算sunion:

(运算后的结果是乱序的)

还是上面两个集合

Sunionset1set2和sunionset2set1的结果一样都是42f51cdeab3

扩展命令scard/smember/sdiffstore/sinterstore/sunionstore

scardmyset表示获取myset集合中元素的个数

srandmemberset1表示随机返回set1集合中的一个元素

sdiffstoremysetset1set2表示把集合set1和set2的差集存入到myset集合中,若没有myset集合,则创建一个

sinterstoremysetset1set2表示把集合set1和set2的交集存储到myset集合中

sunionstoremysetset1set2表示把集合set1和set2的并集存储到myset集合中

set的应用场景:

1.跟踪一些具有唯一性的数据;

2.维护数据对象之间的一些关联关系;

举例说明:

比如购买某种电子商品的客户的id被存储到指定的set中,购买另一种商品的用户的id被存储到另一指定的set中,那么我们就能够通过交集拿到同时购买过这两种商品的用户的id进而获取到用户的其他信息。

 

⑥存储sorted-set:

与set极为相似

Sorted-set与set的区别:

sorted-set中的每一个成员都会有一个分数与之关联,redis正是利用这个分数来为集合中的成员来进行排序的,默认是从小到大排序的,也可以在查询的时候将查询结果进行从大到小排序。

需要指出的是,虽然sorted-set中的元素必须是唯一的,但分数是可以重复的。

在sorted-set中进行元素的添加、删除和更新操作时,都是非常高效的;

存储sorted-set常用的命令:

添加元素zadd:

zaddmysort70zhangsan80lisi90wangwu表示给mysort中添加zhangsan、lisi和wangwu三个元素,对应的分数分别为70、80和90

获得元素zscore/zcard:

zscoremysortzhangsan表示获得mysort集合中张三的分数,返回结果为70

zcardmysort表示获取mysort集合中元素的个数

删除元素zrem/zremrangebyrank/zremrangebyscore:

zremmysorttomwangwu表示删除mysort中的tom和wangwu两个元素

zremrangebyrankmysort04按照排名删除mysort中第0到第4个位置的元素

zremrangebyscoremysort70100按照分数删除70-100之间的元素,包括70和100

范围查询zrange/zrevrange:

zrangemysort0-1表示查询mysort集合中的第0到最后一个元素

zrangemysort0-1withscores表示查询出mysort集合中第0个到最后一个元素及其分数

zrevrangemysort0-1withscores表示从查询所有元素并大到小排序

扩展命令zrangebyscore…limit…/zincrby/zcount

zrangebyscoremysort0100withscoreslimit04表示查出mysort集合中分数为0-100的元素的前四个并按照分数从小到大排序

zincrbymysort2liuqian表示给mysort集合中的liuqian元素的分数加2

zcountmysort050表示获取mysort集合中分数在0-50之间的元素的个数

使用场景:

1.大型游戏积分排行榜,每当玩家分数发生变化的时候可采用zadd命令来更新分数,此后可以使用zrange来获取积分,然后获取用户信息

2.构建索引数据

Keys的通用操作

keys*:

查询所有的key

keysmy?

查询所有以my开头并且my后面只有一个字符的key

keysmyN:

查询所有以my开头并且my后面有N个字符的key

delmyListmyHash:

删除myList和myHash两个key

existsmylist:

判断是否存在mylist,如果存在则返回1,否则返回0

renamemylistnewmylist:

将mylist重命名为newmylist

expirenewmylist1000:

设置newmylist的过期时间为1000s

ttlnewmylist:

查询newmylist所剩超时时间,如果没有设置超时时间,则返回-1,如果超时时间已用完,则返回-2

typemyhash:

获取myhash的数据类型

flushall:

清空数据库中的所有数据

setNX:

在key不存在的时候相当于set,当key存在的时候不做任何操作

getset:

相当于修改,先get再set

Jedis的特性

多数据库

一个redis实例可包含多个数据库,客户端可以指定连接某个redis实例的某个数据库,就跟mysql中创建多个数据库一样,客户端连接时可指定连接哪个数据库。

一个redis实例最多可提供16个数据库,下表分别为0-15,客户端默认连接第0个数据库,也可通过select来选择具体连接哪个数据库。

如果想把一个数据库中的key移到另外一个数据库中去,则可以使用move命令:

movemyset1:

将当前数据库中的myset移动到下表为1的数据库中去。

事物

与其他众多数据库一样,作为NoSql数据库,redis也提供了事物操作。

事物相关的命令:

multi:

开启事物,在mylti之后的命令都被视为事物相关的操作,在multi之后的命令都会被存到命令的队列中,直到执行exec命令,队列中的命令就会被原子化的执行。

测试:

同时打开两个客户端连接,在第一个连接中设置num的值为1(setnum1),然后从两个连接中获取的num值都为1.

在第一个连接中先执行命令multi,然后再执行两次给num加1的命令(incrnum),这时候在第二个连接中进行查询num的值,仍然是1,这就说明事物还没有被提交。

exec:

提交事物,multi后面的命令都写完之后,执行该命令,这时候事物队列中所有的命令都会被提交执行。

测试:

在第一个连接中执行exec命令,然后再第二个连接中查询num的值为3,说明事物执行成功。

discard:

回滚事物,在没有执行exec的情况下回滚,队列中的命令就全都不会被执行。

测试:

在第一个连接中先添加一个user为tom(setusertom),然后执行multi,然后执行setuserjerry,然后再执行discard,然后再第二个连接中进行查询(getuser)的结果还是tom,说明事物回滚成功。

与关系型数据库相比,在redis事物中,如果某一个命令执行失败了,后面的命令还是会被执行。

Jedis的持久化

redis之所以性能很高是因为所有的数据都存在了内存中,为了使redis再重启之后仍然能够保证数据不丢失,就需要将数据从内存中同步到磁盘中,这个过程就成为redis的持久化操作。

redis持久化有两种方式:

RDB方式和AOF方式。

RDB方式

默认支持这种方式,不需要额外配置。

这种方式是在指定的时间间隔内,将内存中的数据和快照写入到磁盘。

优势:

1.只包含一个文件,对于文件备份而言是非常完美的。

一旦系统出现灾难性故障我们就能够非常容易的恢复数据。

2.对于灾难恢复而言,RDB是非常不错的选择。

因为我们能够非常容易的将一个文件压缩后,转移到其他的介质上。

3.性能最大化。

相比AOF,如果数据集很大的话,RDB启动效率更高。

劣势:

1.如果想保证数据的高可用性,即要最大限度的避免数据的丢失,那么RDB将不是很好的选择,因为系统一定在定时持久化之前出现一些down机的情况,还没得及写入到硬盘数据就丢失了。

2.由于RDB通过fork子进程方式来完成数据持久化工作的,因此,如果当数据集非常大的时候,可能会导致整个服务器需要停止几百毫秒甚至超过一秒。

配置:

在redis的配置文件中有默认的配置,我们不需要修改,如下图。

上图含义:

每900秒有1个key发生变化的话就持久化一次;

每300秒有10个key发生变化的话就持久化一次;

每60秒有10000个key发生变化的话就持久化一次;

dump.rdb为保存的文件名称;

./data/为保存的文件路径。

AOF方式

这种方式将以日志的形式记录服务器所处理的每一个操作,在redis服务器启动之初会读取该文件,然后重新构建数据库,这样就能够保证redis启动后数据库中的数据是完整的。

优势:

1.更高的数据安全性(性能较低);

2.由于这种方式对日志的修改采用append追加的模式,因此在写入过程中即使出现了down机的情况,也不会破坏日志文件中已经存在的内容。

如果本次操作只是写入了一半数据就出现了系统崩溃的问题,也不用担心,在redis下一次启动之前,我们可以通过redis-check-aof(在redis安装目录下)这个工具来帮助我们解决数据一致性问题;

3.如果日志过大,redis可以自动启动重写机制。

redis以append模式不断地将修改的数据写入到老的磁盘文件中,同时redis还会创建一个新的文件用于记录在此期间产生的哪些修改命令被执行了,因此在进行重写切换的时候,可以更好的保证数据的安全性;

4.AOF包含一个格式非常清晰易于理解的日志文件用于记录所有的修改操作,我们也可以通过这个文件来完成数据的重建。

劣势:

1.对于相同数量的数据集而言,AOF的持久化文件要比RDB的持久化文件大一些;

2.根据同步策略的不同,AOF在运行效率上往往会低于RDB;

配置:

默认情况下不适用AOF,如果想要启动则置为yes

当启用AOF后,就会产生这个名称的文件

这三行是对同步策略的设置,always代表每修改一次就给磁盘上同步一次,everysec表示每秒同步一次,no代表不同步。

为了更安全,我们往往会选择同步方式为always。

同时使用RDB和AOF方式

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2