redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8424字,纯文字阅读大概需要13分钟。
内容图文
![redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化](/upload/InfoBanner/zyjiaocheng/911/11c27aabcacc483ba35a1fd64bd49359.jpg)
简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis是一个开源的内存数据库,它以键值对的形式存储数据。由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也提供了持久化存储机制,将数据以某种形式保存在文件中,每次重启时,可以自动从文件加载数据到内存当中。
Redis的架构包括两个部分:Redis Client和Redis Server。Redis客户端负责向服务器端发送请求并接受来自服务器端的响应。服务器端负责处理客户端请求,例如,存储数据,修改数据等。
Redis通常用作数据库,缓存以及消息系统。
下载安装
下载地址:https://github.com/microsoftarchive/redis/releases
根据自己的电脑选择合适的版本,我的是64位的。
首先启动redis服务,找到redis-server.exe的位置,然后加上redis.windows.conf。后面可以将redis安装路径设置到环境变量中,这样以后启动会方便不少。
然后打开redis-cli.exe,练习一些命令
redis数据类型
redis中的数据类型为string、list、set、hash以及zset(有序集合)
string
字符串(包括字节串、整数、浮点数)
2、相关命令
127.0.0.1:6379> set key1 value1 OK 127.0.0.1:6379> get key1 "value1" 127.0.0.1:6379> append key1 str (integer) 9 127.0.0.1:6379> get key1 "value1str" 127.0.0.1:6379> del key1 (integer) 1
set:set key value //设置key value一对键值对 get:get key //获取key的value值 del:del key //删除key的键值对 append:append key val //在键为key的value后加上val。例如原键值对为{"name": "ty"},val为ong,则结果为{"name": "tyong"}
list
列表(有序、可有重复元素)
常用命令:
//在list-key的左端存放item1 127.0.0.1:6379> lpush list-key item1 (integer) 1 //在list-key的右端存放item2 127.0.0.1:6379> rpush list-key item2 (integer) 2 //获取0位置上的元素 127.0.0.1:6379> lindex list-key 0 "item1" //获取0-1位置的元素(包含0,1位置) 127.0.0.1:6379> lrange list-key 0 1 1) "item1" 2) "item2" //截取0-1位置的元素(包含0,1位置) 127.0.0.1:6379> ltrim list-key 0 1 OK //弹出list-key左边的元素 127.0.0.1:6379> lpop list-key "item1" //弹出list-key右边的元素 127.0.0.1:6379> rpop list-key "item2" 127.0.0.1:6379> lpush list-key item1 (integer) 1 127.0.0.1:6379> lpush list-key item2 (integer) 2 //b代表block,阻塞弹出list-key左边的元素,或者在1s内阻塞并等待可弹出的元素出现 127.0.0.1:6379> blpop list-key 1 1) "list-key" 2) "item2" //b代表block,阻塞弹出list-key右边的元素,或者在1s内阻塞并等待可弹出的元素出现 127.0.0.1:6379> brpop list-key 1 1) "list-key" 2) "item1" 127.0.0.1:6379> lpush source-key val1 (integer) 1 127.0.0.1:6379> lpush source-key val2 (integer) 2 //将source-key右端的元素弹出并且放入到dest-key的左端 127.0.0.1:6379> rpoplpush source-key dest-key "val1" //阻塞将source-key右端的元素弹出并且放入到dest-key的左端,最长阻塞时间为1s 127.0.0.1:6379> brpoplpush source-key dest-key 1 "val2"
set
集合(无序、不可重复,存单个值)
相关命令:
//添加item1到set-key中 127.0.0.1:6379> sadd set-key item1 (integer) 0 //查询set-key中所有元素 127.0.0.1:6379> smembers set-key 1) "item1" //判断item1是否在set-key中 127.0.0.1:6379> sismember set-key item1 (integer) 1 //查询set-key的长度 127.0.0.1:6379> scard set-key (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 item4 (integer) 1 //删除set-key中item4 127.0.0.1:6379> srem set-key item4 (integer) 1 //随机删除一个元素 127.0.0.1:6379> spop set-key "item3"
hash
散列(存键值对)
相关命令:
//添加键值对到hash-key中 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 //在hash-key中获取key1的value 127.0.0.1:6379> hget hash-key key1 "value1" //获取hash-key所有的键值对 127.0.0.1:6379> hgetall hash-key 1) "key1" 2) "value1" //删除key为key3的键值对 127.0.0.1:6379> hdel hash-key key3 (integer) 1 //获取key1、key2的value值 127.0.0.1:6379> hmget hash-key key1 key2 1) "value1" 2) "value2" //获取键值对的长度 127.0.0.1:6379> hlen hash-key (integer) 2 //获取hash-key所有key值 127.0.0.1:6379> hkeys hash-key 1) "key1" 2) "key2" //获取hash-key所有的value值 127.0.0.1:6379> hvals hash-key 1) "value1" 2) "value2" //删除key为key1的键值对 127.0.0.1:6379> hdel hash-key key1 (integer) 1 127.0.0.1:6379>
zset
有序集合(存储键值对,包括成员和分值)
相关命令:
//添加member0到zset-key中 127.0.0.1:6379> zadd zset-key 788 member0 (integer) 1 //取0 -1之间的元素,-1代表最后一个元素,并且根据分值排序 127.0.0.1:6379> zrange zset-key 0 -1 withscores 1) "member0" 2) "788" //获取分值为800以内的元素,并且按照分值排序 127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores 1) "member0" 2) "788" //获取zset-key的长度 127.0.0.1:6379> zcard zset-key (integer) 1 //返回成员member0在有序集合中的排名 127.0.0.1:6379> zrank zset-key member0 (integer) 0 //删除member0 127.0.0.1:6379> zrem zset-key member0 (integer) 1 127.0.0.1:6379>
发布与订阅
1、发布订阅架构
发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。
2、发送消息
Redis采用PUBLISH命令发送消息,其返回值为接收到该消息的订阅者的数量。
3、订阅某个频道
Redis采用SUBSCRIBE命令订阅某个频道,其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道。
4、取消订阅
Redis采用UNSUBSCRIBE和PUNSUBSCRIBE命令取消订阅,其返回值与订阅类似。
由于Redis的订阅操作是阻塞式的,因此一旦客户端订阅了某个频道或模式,就将会一直处于订阅状态直到退出。在SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE和PUNSUBSCRIBE命令中,其返回值都包含了该客户端当前订阅的频道和模式的数量,当这个数量变为0时,该客户端会自动退出订阅状态。
不过通常发送-订阅使用redis比较少,可以使用activemq等mq方式。
持久化
1、什么是redis持久化?
简单来讲就是将数据放到断电后数据不会丢失的设备中,也就是我们通常理解的硬盘上。
2、redis写操作过程
- 客户端向服务端发送写操作(数据在客户端的内存中)。
- 数据库服务端接收到写请求的数据(数据在服务端的内存中)。
- 服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。
- 操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。
- 磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。
3、rdb和aof
a、rdb(快照)
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内容如超过10个key被修改,则发起快照保存 save 60 10000 #60秒内容如超过10000个key被修改,则发起快照保存
rdb保存过程:
- redis调用fork,现在有了子进程和父进程。
- 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。
- 当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用。
另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不 是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
b、aof
redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。
当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)。
appendonly yes //启用aof持久化方式 # appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用 appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 # appendfsync no //完全依赖os,性能最好,持久化没保证
内容总结
以上是互联网集市为您收集整理的redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化全部内容,希望文章能够帮你解决redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。