redis 入门
redis 入门
一、redis 安装
==1)linux:==
wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar xvf redis-3.2.9.tar.gz cd redis-3.2.9 make install PREFIX=/root/svr/redis-3.2.9 #安装 src/redis-server ../redis.conf& #启动 src/redis-cli #客户端连接
==2)windows==
百度 N多。步骤简单。如:https://www.cnblogs.com/jaign/articles/7920588.html
二、简单命令介绍
==1)【set key value】==:设置 key 对应值。
获取 key 的对应值。get key
127.0.0.1:6379> set key value OK 127.0.0.1:6379> get key "value"
==2)【setnx key value】==设置 key 对应的值,如果 key 存在,返回0 , nx 是 not exist的意思。
127.0.0.1:6379> setnx key value (integer) 0 127.0.0.1:6379> setnx keynew value (integer) 1
*==3)【keys 】==:查找key
127.0.0.1:6379> keys * 1) "key2" 2) "k4" 3) "k3" 4) "setname" 127.0.0.1:6379> keys k* 1) "key2" 2) "k4" 3) "k3"
==4)【exists key】==:查看 key 是否存在
127.0.0.1:6379> exists key (integer) 1 127.0.0.1:6379> exists abd (integer) 0
存在返回1,不存在,返回0
==5)【del key】==:删除某个key
127.0.0.1:6379> del keynew (integer) 1 127.0.0.1:6379> del keynew (integer) 0
第一次返回1,删除成功,第二次删除失败返回0.
==6)【expire】==:设置过期时间(单位秒)
127.0.0.1:6379> expire key 40 (integer) 1 127.0.0.1:6379> ttl key (integer) 36 127.0.0.1:6379> ttl key (integer) 33 127.0.0.1:6379> ttl key (integer) 29 127.0.0.1:6379> ttl key (integer) -2
ttl 查看剩下多少时间,返回负数则 key 失效,key 不存在。
==7)【setex】==:设置key同时,设定超时时间。
127.0.0.1:6379> setex key 10 value OK 127.0.0.1:6379> ttl key (integer) 6
==8)【mset】==:一次性设置多个key的值,成功返回ok,表示所有值都设置了,失败返回0,表示没有任何值被设置。
127.0.0.1:6379> mset key value key1 value key3 vlaue2 OK
==9)【getset oldkey newkey】==:设置 key 的值,并返回 key 的旧值。
127.0.0.1:6379> getset key aaaaa "value"
==10)【mget】==:一次获取多个key的值,对于的key不存在,则对应返回 nil
127.0.0.1:6379> mget key key1 key2 key3 key4 1) "aaaaa" 2) "value" 3) "aaaa" 4) "vlaue2" 5) (nil)
==11)【incr intkey】==:对key的值做加加操作,并返回新的值,注意 incr 一个不是 int 的value,会返回错误,incr 一个不存在的key 则会设置key为 1
127.0.0.1:6379> incr key (error) ERR value is not an integer or out of range 127.0.0.1:6379> incr ccc (integer) 1 127.0.0.1:6379> incr ccc (integer) 2 127.0.0.1:6379> incr ccc (integer) 3
==12)【incrby intkey number】==:同incr
类似,加指定的值,key不存在时候,会设置key,并认为越来的value 为 0 .
127.0.0.1:6379> incrby ccc 100 (integer) 103 127.0.0.1:6379> incrby aaa 10 (integer) 10
==13)【decr】==:对key的值做减减操作,如果 decr 一个不存在的 key , 则设置 key 为 -1
127.0.0.1:6379> decr bbb (integer) -1 127.0.0.1:6379> decr bbb (integer) -2 127.0.0.1:6379> decr aaa (integer) 9
==14)【decrby】==:对key的值做指定的减减
127.0.0.1:6379> decrby aaa 100 (integer) -91
==15)【append】==:制定 key 的字符串追加 value, 返回新字符串的长度。
127.0.0.1:6379> get key "aaaaaaaaa" 127.0.0.1:6379> append key bbbb (integer) 13 127.0.0.1:6379> get key "aaaaaaaaabbbb"
==16)【strlen】==:取指定 key 的 value 值的长度。
127.0.0.1:6379> strlen key (integer) 13
==17)【persist】==: 取消过期时间
127.0.0.1:6379> setex time 1000 vvvv OK 127.0.0.1:6379> ttl time (integer) 996 127.0.0.1:6379> persist time (integer) 1 127.0.0.1:6379> ttl time (integer) -1 127.0.0.1:6379> get time "vvvv"
==18)【select】==:选择数据库(0-15库),单机版本,有数据库的概念,可以使用select 进行切换。
127.0.0.1:6379> keys * 1) "bbb" 2) "key2" 3) "k4" 4) "k3" 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * (empty list or set)
==19)【move】==:把某个key移动到其他库。
127.0.0.1:6379> move bbb 1 (integer) 1 127.0.0.1:6379> get bbb (nil) 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * 1) "bbb"
==20)【randomkey】==:随机返回一个key
127.0.0.1:6379> randomkey "k3" 127.0.0.1:6379> randomkey "k4" 127.0.0.1:6379> randomkey "key2" 127.0.0.1:6379> randomkey "time"
==21)【rename】==:重命名
127.0.0.1:6379> rename k3 k33333 OK
==22)【type】==:返回数据类型
127.0.0.1:6379> type ccc string
23)==【dbsize】==:返回 key 的数量
127.0.0.1:6379> dbsize (integer) 15
==24)【info】==:输出redis信息
127.0.0.1:6379> info # Server redis_version:3.2.9 。。。。。。 executable:/data/redis/redis-3.2.9/src/redis-server config_file:/data/redis/redis-3.2.9/redis.conf # Clients connected_clients:1 。。。。 # Memory used_memory:822920 。。。。。 # Persistence loading:0 。。。。。。 # Stats total_connections_received:4 。。。。。 # Replication role:master 。。。。 # CPU used_cpu_sys:76.85 。。。。 # Cluster cluster_enabled:0 # Keyspace db0:keys=15,expires=0,avg_ttl=0 db1:keys=1,expires=0,avg_ttl=0
==25)【config get|set】== : 显示与修改配置
127.0.0.1:6379> config get '*port*' 1) "port" 2) "6379" 3) "slave-announce-port" 4) "0"
三、数据类型
==1)String字符串:==
- 格式:
set key value
- string 类型是二进制安全的,意思是 redis 的 string 可以包含任何数据,比如jpg图片或者序列化的对象。
- string 类型是redis最基本的数据类型,一个键最大能存储512MB
127.0.0.1:6379> set string 'aaaa' OK 127.0.0.1:6379> get string "aaaa"
==2)Hash(哈希)==
- 格式:
hmset name key1 value1 key2 value2
- redis hash 是一个健值(key=>value)对集合。
- redis hash 是一个String 累心的 field 和 value 的映射表,hash特别适合用于存储对象。
- 可以简单的理解为一个
hashMap<key ,value>
127.0.0.1:6379> hmset myhash will 111 fff 2222 aaa 1111 ccc 3333 OK 127.0.0.1:6379> hget myhash will "111" 127.0.0.1:6379> type myhash hash
==3)List(列表)==
- redis 列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表头(左边)或着尾部(右边)
- 格式:lpush name value
- 在key对应list 的头部添加字符串元素。
- 格式:rpush name value
- 在key 对应list 的尾部添加字符串元素
- 格式:lrem name index
- key 对应list 中 count 个 和 value 相同的元素。
- 格式:llen name
- 返回 key 对应 list 的长度
127.0.0.1:6379> lpush mylist redis (integer) 1 127.0.0.1:6379> lpush mylist mogodb (integer) 2 127.0.0.1:6379> lpush mylist hbase (integer) 3 127.0.0.1:6379> lrange mylist 0 10 1) "hbase" 2) "mogodb" 3) "redis" ......... 127.0.0.1:6379> lrange mylist 0 10 1) "hbase" 2) "hbase" 3) "hbase" 4) "hbase" 5) "mogodb" 6) "redis" 127.0.0.1:6379> lrem mylist 2 hbase (integer) 2 127.0.0.1:6379> lrange mylist 0 10 1) "hbase" 2) "hbase" 3) "mogodb" 4) "redis"
==4)Set(集合)==
格式:sadd name value
- Redis的set是string 类型的无序集合。
- 集合是通过hash实现的,所以添加,删除,查找的复杂度都是0(1)。
127.0.0.1:6379> sadd myset redis (integer) 1 127.0.0.1:6379> sadd myset redis (integer) 0 127.0.0.1:6379> sadd myset hbase (integer) 1 127.0.0.1:6379> sadd myset mogodb (integer) 1 127.0.0.1:6379> smembers myset 1) "mogodb" 2) "hbase" 3) "redis"
==5)zset(sorted set:有序集合)==
- 格式:zadd name score value
- Redis zset 和 set 一样 也是 string 类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的每个成员从大到小排序的。
- zset的成员是唯一的,但是分数(score)却可以重复
127.0.0.1:6379> zadd myzset 1 redis (integer) 1 127.0.0.1:6379> zadd myzset 2 redis (integer) 0 127.0.0.1:6379> zadd myzset 3 mogodb (integer) 1 127.0.0.1:6379> zadd myzset 1 hbase (integer) 1 127.0.0.1:6379> zrangebyscore myzset 0 100 1) "hbase" 2) "redis" 3) "mogodb"
四、事务
redis 对事务的支持目前还比较简单。redis 只能保证一个 client 发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。由于 redis 是单线程来处理所有client 的请求的所以做到这点很容易的,一般情况下 redis 在接受到一个client 发来的命令后,会立刻处理并 返回处理结果,但是当一个client 在一个连接中发出multi命令有,这个链接会进入一个事务上下文,该链接后续的命令并不是立即执行,而是先放到一个对联中,当从此链接受到 exec 命令后,redis 会顺序的执行队列中的所有命令,并将所有命令的运行结果打包到一起返回给 client 然后此链接就结束事务上下文。
开启事务:multi
取消事务:discard
结束事务:exec
127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> set name wangwu OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> get age QUEUED 127.0.0.1:6379> get name QUEUED 127.0.0.1:6379> incr age QUEUED 127.0.0.1:6379> exec 1) "20" 2) "wangwu" 3) (integer) 21 127.0.0.1:6379> get age "21" 127.0.0.1:6379> multi OK 127.0.0.1:6379> incr age QUEUED 127.0.0.1:6379> incr name QUEUED 127.0.0.1:6379> exec 1) (integer) 22 2) (error) ERR value is not an integer or out of range 127.0.0.1:6379> get age "22"
五、发布与订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似,pub/sub 不仅仅解决发布者和订阅者直接代码级别耦合,也解决两者在物理部署上的耦合。
订阅主题:subscribe
取消主题:unsubscribe
推送:publish
127.0.0.1:6379> subscribe price Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "price" 3) (integer) 1 1) "message" 2) "price" 3) "aaaa" 1) "message" 2) "price" 3) "bbbb"
127.0.0.1:6379> publish price aaaa (integer) 1 127.0.0.1:6379> publish price bbbb (integer) 1
他们之间的配合方式:subscribe *
支持全部订阅,使用 unsubscribe
可以过滤掉部分。
六、持久化
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失,Redis提供了两种持久化方法:RDB(默认)和AOF。
==1)RDB==
rdb 是 Redis DataBase 缩写。
RDB 功能核心函数 rdbSave(生成RDB文件)和rdbLoad(从文件加载到本地)两个函数
- redbSave 函数:将内存中的数据库数据以RDB格式保存到磁盘(文件)中,文件存在,那么新的RDB文件将替换已有的RDB文件。
- 在保存 RDB 文件期间,主进程会被堵塞,直到保存完成为止。
- SAVE 和 BGSAVE 两个命令是操作rdbSave函数的区别:
- SAVE 直接调用rdbSave , 堵塞Redis 主进程,直到保存完成为止,在主进程保存完成之后向主进程发送信号,通知保存已完成。因为rdbSave在子进程被调用,所以Redis服务器在BGSAVE执行期间仍然可以继续处理客户端的请求。
- BGSAVE 则fork出一个进程,子进程负责调用rdbSave , 并在保存完成之后,向主进程发送信号,通知保存完成。因为rdbsave 在子进程被调用,所以redis服务器在BGSAVE 执行期间,仍然可以继续处理客户端的请求。
- rdbLoad 函数:是redis 服务重启或则启动的时候回加载保存到磁盘的RDB文件加载到内存中会被堵塞。
存储结构:(http://redisbook.readthedocs.io/en/latest/internal/rdb.html#id4)
+-------+-------------+-----------+-----------------+-----+-----------+ | REDIS | RDB-VERSION | SELECT-DB | KEY-VALUE-PAIRS | EOF | CHECK-SUM | +-------+-------------+-----------+-----------------+-----+-----------+
保存策略:(关于redis.conf相关配置如何介绍,请看《redis.conf详解》)
save 900 1 // 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
save 300 10 // 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
save 60 10000 // 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
==2)AOF==
Aof 是 Append-only file 缩写
----图
每当执行服务器(定时)任务或者函数时,flushAppendOnlyFile 函数都会被调用,这个函数执行以下两个工作。
aof写入保存:
WRITE:根据条件,将aof_buf中的缓存写入到AOF文件
SAVE:根据条件,调用fsync或fdatasync函数,将AOF文件保存到磁盘中。
两个步骤都需要根据一定的条件来执行,redis提供了三种条件。
保存策略:
模式 | WRITE是否阻塞 | SAVE是否阻塞 | 停机时丢失的数据量 |
---|---|---|---|
AOF_FSYNC_NO 不保存 | 阻塞 | 阻塞 | 操作系统最后一次对 AOF 文件触发 SAVE 操作之后的数据。 |
AOF_FSYNC_EVERYSEC 每一秒钟保存一次 | 阻塞 | 不阻塞 | 一般情况下不超过 2 秒钟的数据 |
AOF_FSYNC_ALWAYS每执行一个命令保存一次 | 阻塞 | 阻塞 | 最多只丢失一个命令的数据。 |
存储结构:
内容是redis同学协议(RESP)格式的命令文本存储。
==3)总结==
- RDB模式的保存策略可以看出,他是有丢失的概率,有可能出现5分钟才保存一次RDB文件。
- AOF模式可以保证最少的数据丢失,就算停机故障了,最多只会丢失一秒钟的数据,但是他数据重新加载,速度比RDB慢。
- AOF 在过去曾经发生过这样bug:因为个别命令的原因,导致AOF文件在重新载入时,无法将数据集恢复成保存时的原样(如:堵塞命令 BRPOPLPUSH 就曾经引起过这样的bug。)
so:个人建议还是让专业的工具,做专业的事情,不用把redis当作数据库传统数据库使用。
七、复制
通常为被复制方(master)主动将数据发送到复制方(slave),复制方接收到数据存储在当前实例,最终目的是为了保证双方的数据一致,同时也是降低了 master 的压力。
Redis 的复制方式有两种,一种是主(master)-从(slave)模式,一种是从(slave)-从(slave)模式。
复制流程图:
1、slave向master发送sync命令。
2、master开启子进程执行bgsave写入rdb文件,同时将子进程接收到的写命令缓存起来。
3、子进程写完,父进程得知,开始将RDB文件发送给slave
4、master 发送完RDB文件,将缓存的命令发送给slave。
5、master 增量的把写命令发送给 slave。
主从复制:
- cp redis.conf redis2.conf
- vim redis2.conf(slave)
- slaveof 192.168.0.2 6379(master的地址)
- vim redis.conf(master)
- bind 0.0.0.0 #无 ip 都可以反问
- ./redis-server ../redis.conf #master
- ./redis-server ../redis2.conf #slave
ps:是否成功 set get 请求来判断或执行 info 命令
判断是否成功:
1、master 客户端set值, slave 客户端能不能获取到。
2、config get ‘slaveof*’
7001 master
[root@wei-BaiDu 7001]# ./redis-cli -h 127.0.0.1 -p 7001 127.0.0.1:7001> keys * (empty list or set) 127.0.0.1:7001> set key1 aaaa OK
7002 slave
[root@wei-BaiDu 7002]# ./redis-cli -h 127.0.0.1 -p 7002 127.0.0.1:7002> keys * (empty list or set) 127.0.0.1:7002> get key1 "aaaa" 127.0.0.1:7002> config get 'slaveof' 1) "slaveof" 2) "127.0.0.1 7001"
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spark Catalyst 的实现分析
title: Spark Catalyst Deep Divedate: 2018-07-19 18:15:40 tags: Spark Spark Catalyst 的实现分析 转载自:Spark Catalyst 的实现分析 Spark SQL 和 Catalyst 分别对应了 SQL 执行期以及解析期的优化工作,因此 Catalyst 的理解是 Spark SQL 的第一步。在一些 Catalyst 的介绍以及讲座中,下面一张图是必出现,它描述了从 SQL 语句到最后执行 Plan 的生成过程中,除了 Spark SQL,其他 SQL 引擎的工作原理也基本一致,比如 Hive 之类的。 本文核心也是介绍 Catalyst 内部的实现,但是不是按照这张图的步骤来介绍 Catalyst 的实现原理,而是按照 SQL 给人最直接几个概念,比如 Row,Expression,Plan 来逐步介绍它们的内部实现。 看过 Spark SQL 或者 Catalyst 人都知道,相比 Spark Core 的代码,这一块真的挺复杂了,各种算法逻辑,复杂的 Scala 语法元素,以及各种性能优化,...
- 下一篇
借助Beats快速搭建可视化运维系统
题记:本例实现了一个对个人PC的可视化运维dashboard。拓展至N个节点的集群也同理可以实现。对于个人或者企业而言,约等于0成本的对接,将一步迈入可视化运维监控的阶段。 背景介绍 Beats 平台集合了多种单一用途数据采集器。这些采集器安装后可用作轻量型代理,从成百上千或成千上万台机器向 Logstash 或 Elasticsearch 发送数据。Metricbeat是一个轻量级的指标采集器,用于从系统和服务收集指标。从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据。这篇文章向用户演示,如何使用Metricbeat采集一台Mac电脑的指标信息,投递到阿里云Elasticsearch(以下统称‘阿里云ES’)上,并且在Kibana中生成对应dashborar
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境