redis 学习笔记

  • Post author:
  • Post category:其他

简介:
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。
从介绍可以看出,三个特点:
1.支持网络(for cluster)
2.基于内存,亦可持久化(高速(缓存),持久化(硬盘))
3.key-value 存储
经查还有一个特点就是:4.支持master-slave模式的数据备份
优势:
1.性能极高(读的速度是110000次/s,写的速度是81000次/s(基本不关心))
2.value的类型丰富:value可以是String类型,list(链表),set(集合),zset(有序集合),hash五种
3.支持原子操作,也可以支持合并原子后的原子操作
4.支持发布/订阅模式,通知,key过期等
开始学习:
1,安装https://github.com/MSOpenTech/redis/releases。直接下载zip包
2.解压:这里解压以我的为例,路径:e:/java/redis 后面用redisHome代替
3.测试:打开一个cmd,进入redisHome,输入 redis-server.exe redis.windows.conf ,如果弹出端口信息什么的,成功。重新打开另一个cmd,不要关闭第一个,进入redisHome,输入redis-cli.exe -h 127.0.0.1 -p 6379 ,回车,set myKey abc 回车,get myKey,测试成功。这是基于windows x64的机子,如果是linux或者其他系统,请自行百度安装方法。
4.设置一个简单的key-value
String类型:(注意:一个键最大能存储512MB)
set name “runoob” 回车
get name 回车,便可看到”runoob”字样
这句话的意思就是设置一个key 是 name,值是”runoob”的数据
hash类型:(每个hash可以存储2^32 -1也就是40多亿键值对)
hmset user:1 username password data 回车
hgetall user:1 回车
便能看到上面存储的username等等数据,主要适合用于存储对象
list(链表类型):(每个链表可以存储2^32 -1也就是40多亿元素)
可以通过lpush或者rpush将元素插入到链表的左边或者右边
例如:lpush runoob element1 回车
rpush runoob element2 回车
然后通过lrange runoob 0 10查看链表runoob 0到10的元素,回车就可以看到刚刚插入的数据。
set(集合):集合中最大的成员数为 232 – 1(4294967295, 每个集合可存储40多亿个成员)。
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。
例如:向集合ysset中添加数据(element1,element2)并显示
sadd ysset element1 回车
sadd ysset element2 回车
smembers yssset 回车即可看到效果
zset(sorted set:有序集合)
zset(有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
例如:向有序集合yszset中插入数据(element1,element2,element3)并显示
zadd yszset 0 element1 回车
zadd yszset 1 element2 回车
zadd yszset 0 element3 回车
zrangebyscore yszset 0 100 回车即可看到有序集合yszset中分数为0到100的元素
5.常用命令
5.1删除:del key_name
删除键为key_name的String数据,如果成功返回1,如果失败,返回0
5.2序列化:dump key_name
序列化键为key_name的值,目前感觉没什么鸟用,可能用于存储吧
5.3检查给定key是否存在:exists
存在返回1,否则返回0
5.4给键设置保持时间:expire key_name time_in_second
设置名为key_name的键的保留时间为time_in_second秒
5.5给键设置一个保持时间(时间戳) expireat key_name time_in_timestamp
设置名为key_name的键的保留时间到time_in_timestamp
5.5.给键设置一个保持时间(毫秒计):pexpireat key_name time_in_millionsecond
设置名为key_name的键的保留时间为 time_in_millionsecond毫秒
5.6 查找指定样式的键:keys pattern
例如:set name1 1回车
set name2 2回车
set name3 3回车
keys name* 回车即可看到效果
如果要看当前的所有key,直接keys * 回车
5.7 移动某个键到制定数据库 :move key_name destination_db
redis数据库默认使用数据库0.可以显示的让他使用某个数据库,比如 select 0,让他使用数据库0。
例如:move key_name 1 移动key_name到数据库1
exists key_name 则显示为0
如果select 1之后再执行 exists key_name 则结果为1则说明key_name被移动到数据库1中了
5.8移除键的保留时间,让他持久化:persist key_name
成功返回1,否则返回0.
比如:set name1 1回车
expire name1 50 //保持50秒
ttl name1 //查看剩余多少时间
persist name1 //持久化
ttl name1//-1表示该键已被持久化-2表示该键不存在
5.9查看键的保留时间:pttl key_name除却返回值是毫秒之外,其余与ttl相同
5.10随机返回一个key: randomkey 数据库为空时,返回nil
5.11删除所有key :flushdb
5.12修改键名:rename old_key_name new_key_name
如果有同名的键则覆盖掉
5.13修改键名:renamenx old_key_name new_key_name
如果有同名的则失败
5.14返回key所存储的值的类型:type key_name
返回的数据类型有上述的5中数据类型
6.String类型
6.1 getrange key_name start end
例如:getrange key_name 0 3 意思就是获取键名为key_name的前4位字符
getrange key_name 0 -1意思就是获取全部长度的值,感觉鸡肋,为什么不直接用get
6.2 getset key_name newvalue:设置键key_name的值为newvalue,如果键不存在则创建key并设置他的值为newvalue,如果存在,则设置新值为newvalue而返回新值
6.3 mget key_name1[key_name2….]:获取所给键的值
例如:mget key_name1 key_name2:获取key_name1和key_name2的值
6.4 setex key seconds value:设置键为key的值为value,并且设置他的保留时间为seconds秒
…………
7.后面四种数据类型我也不再一一赘述,具体的可以查看官方文档或者直接百度。
8.基数:hyperloglog(在误差范围内计算重复集合中不重复的元素的个数)
8.1 pfadd命令:将元素添加到hyperloglog中
例如:pfadd mykey a b c d e f
8.2 pfcount:计算hyperloglog的基数估算值
例如:pfadd hill 1 2 3 回车
pfcount hill 回车则看到返回值为3
8.3 pfmerge:将多个hyperloglog合并为一个hyperloglog
例如:pfadd hll1 1 2 3 回车
pfadd hll2 3 2 1 回车
pfmerge hll3 hll1 hll2 回车
pfcount hll3 回车即可看到返回值为6
9. 远程服务连接

$ Redis-cli -h 127.0.0.1 -p 6379
windows下 :redis-cli.exe -h 127.0.0.1 -p 6379
redis 127.0.0.1:6379>

远程服务停止:

$ redis-cli -h 172.168.10.254 -p6379 shutdown

2) 有权限控制时(加上-a 密码):

redis-cli -h 127.0.0.1 -p 6379 -a 123456

10.redis发布订阅
10.1 Redis Psubscribe 命令订阅一个或多个符合给定模式的频道。
每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)。 news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
例如:psubscribe channel1 回车便成功订阅channel1静等消息
10.2查看发布与订阅系统状态
例如:pubsub channels 查看所有发布的主题
10.3 发布消息到指定频道
publish channel message :将消息message发布到channel
10.4订阅一个或者多个频道
subscribe channel1 [channel2..]
10.5退订指定的频道
unsubscribe channel1 退订频道channel1
11.redis事务
11.1 mult:标记一个事务的开始
11.2 exec:执行事务块的所有命令
11.3 discard:取消事务
11.4 watch:监视一个或者多个key,如果事务在执行之前,这个key被别的事务修改或者删除,那么当前事务将被打断
11.5unwatch:取消watch 监视的key
12.redis连接
12.1 auth 命令用于检测给定密码和配置文件密码是否一致
例如:auth password 回车则会弹出erro提示
而如果设置密码之后>config set requirepass “password”
再用auth ‘’password‘’则会返回ok字样
12.2 echo 打印字符串
echo “”helloWord“”回车即可看到helloword字样
12.3 ping 测试与服务器的连接
如果成功返回pong
12.4 quit 关闭客户端和服务器的连接,一旦所有等待中的回复(如果有的话)顺利写入到客户端,连接就会被关闭。
12.5 select 用于选择数据库,默认使用0号数据库,例如 select 0
13.redis服务器
13.1 bgrewriteaof:异步重写aof文件,感觉就是拷贝文件,redis2.4之后这个由redis自动触发,该命令只是手动触发一下
13.2 bgsave 该命令用于在后台异步保存当前的数据到磁盘
13.3 client kill 该命令用于关闭客户端连接 client list 查询出当前服务器的所有连接
再用 client kill ip:port 命令关闭特定的客户端连接
13.4 client setname 设置当前连接的名称 client getname 获取当前连接的名称
13.5 client pause timeout 阻塞客户端timeout毫秒时间
13.6 cluster slots 查看当前的集群,以数组形式返回
13.7 command 返回一个命令数组
13.8 config get 获取redis的配置参数
例如:config get max--entries
13.9 configrewrite 对redis所指定的服务器的redis.conf配置文件进行改写
config set命令可对当前的配置改写,但是可能与配置文件中的不同
例如:config get appendonly 获取参数appendonly
config set appendonly yes 设置参数appendonly的值为yes
config rewrite 将修改后的配置重写进入redis.conf配置文件
13.10 dbsize 返回当前数据库的key的数量
13.11 flushall 清除redis服务器的所有数据(所有数据库)flushdb只是清除当前数据库的所有数据
13.12 lastsave 返回最近一次redis成功保存数据到磁盘上的时间,以Unix时间戳显示
13.13 monitor 实时打印redis服务器接收到的命令,用于调试
13.14 role 用于查看主从实例所属的角色,角色有master,slave,sentinel
13.15 save 执行一个同步操作,将当前的redis实例的所有数据快照都以rdb文件的形式保存到硬盘
13.16 shutdown 该命令执行以下操作:
停止所有客户端
如果有至少一个保存点在等待,那么执行save命令
如果aof选项被打开,那么更新aof文件
关闭服务器
13.17 slaveof 该命令是将当前服务器变为指定服务器的从属服务器
如果当前服务器已经是某个服务器的从属服务器了,那么执行 slaveof host port将使当前服务器放弃原数据集,而且复制指定服务器的数据集,如果对一个从属服务器执行slaveof no one 将使这个服务器关闭复制功能,从而变为一个主服务器,不会丢弃原有数据,利用这一特性,可以在主服务器失败的时候将一个从属服务器变为一个主服务器,实现无间断运行。
13.18 showlog是redis记录查询时间的日志系统,
13.18.1查看日志:slowlog get 2
13.18.2统计日志数量:slowlog len
13.18.3 清除日志 :slowlog reset
13.19 sync 用于同步主从服务器的数据
13.20 time 返回当前的时间 返回值第一个是unix时间戳表示,第二个是当前时间已经流逝的微妙数
14数据库的备份和恢复
save 用来在redis安装目录下创建当前数据库的一个rdb格式的数据备份(dump.rdb)
config get dir 用来恢复数据,前提是rdb文件在安装目录下
bgsave 也是用来创建备份文件的,但是这个运行在后台
15redis安全
config get requirepass 获取当前数据库密码
config set requirepass 设置当前数据库密码
auth 用来验证密码 例如:auth“ysspasss”
16性能测试
redis-benchmark [option] [optionvalue]
这里写图片描述
例如:redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000
以上实例中主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。
17客户端连接
获取最大连接数:config get maxclients
返回当前连接服务器的客户端:client list
client setname :设置当前连接的名称
client getname :获取当前连接的名称
client pause :挂起当前连接
client kill :关闭当前连接
18管道技术
redis是一种基于客户端/服务器模型以及请求/响应协议的tcp服务,这意味着通常情况下一个会遵循以下步骤:
·客户端向服务端发送一个查询请求,并监听socket返回,通常是阻塞模式,等待服务器返回。
·服务端处理命令,并将结果返回给客户端
19redis分区
分区是分割数据到多个redis实例的处理过程,因此每个实例只保存key的一个子集
分区优势:
~利用多台计算机的内存的和值,允许我们创建更大的数据库
~通过多核和多台计算机,允许我们扩展计算能力,通过多台计算机和网络适配器,允许我们扩展网络宽带
不足:
·涉及多个key的操作一般不支持
·涉及多个key的事务一般不支持
·当使用分区的时候,数据处理比较复杂,比如在备份或者恢复的时候要操作好几个实例
分区类型:
1.范围分区:比如id从0到1000的用户会保存到实例r0,id从1001到2000保存到实例r1
2.hash分区


版权声明:本文为Y_FQY原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。