您现在的位置是:首页 > 文章详情

redis 入门

日期:2018-07-24点击:416

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(从文件加载到本地)两个函数

img_a694acd5e12379380fde61ab7ad20042.jpe
11-redis数据持久化.jpg

  • 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 的压力。


img_20bdc86b9b18cbc6d9b23d7f47fbe212.jpe
13-redis数据同步.jpg

Redis 的复制方式有两种,一种是主(master)-从(slave)模式,一种是从(slave)-从(slave)模式。


img_c21def7b5d374247d6506ceec0c3abcb.jpe
![13-redis数据同步.jpg](https://upload-images.jianshu.io/upload_images/5918960-8f1b6855d882d30d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

复制流程图:
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" 
原文链接:https://yq.aliyun.com/articles/637830
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章