前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『互联网架构』软件架构-redis特性和集群特性(上)(48)

『互联网架构』软件架构-redis特性和集群特性(上)(48)

作者头像
IT架构圈
发布2019-05-15 15:53:31
5040
发布2019-05-15 15:53:31
举报
文章被收录于专栏:IT架构圈IT架构圈

上次已经说到了redis其实就是nosql,这次具体redis是个什么样的东西。 源码文档:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』软件架构-redis特性和集群特性(48)

(一)Redis安装

通过虚拟机的方式在centos7下面安装下,这次我不通过docker的方式了,按照正常的方式,让老铁们熟悉redis的结构。

代码语言:javascript
复制
mkdir softcd soft#虽然这个不是最新版本,但是这个版本已经够了解了。#我一直说不要使用最新版本的,#如果新版本没有太多建设性的改变,#因为新版本资料少,出问题不好解决。wget http://download.redis.io/releases/redis-3.2.9.tar.gztar xvf redis-3.2.9.tar.gzcd redis-3.2.9make install PREFIX=/root/soft/redis-3.2.9 #启动src/redis-server ./redis.conf&
ps -ef | grep redis
#客户端连接src/redis-cli 
(二)常用命令
  • keys

*表示区配所有

代码语言:javascript
复制
set liming 'hi'set liming2 'hi'set idig8 'hi'keys * 

以liming开头的

代码语言:javascript
复制
keys liming*
  • exists

key是否存在

代码语言:javascript
复制
exists liexists liming
  • set

设置 key 对应的值为 string 类型的 value。

代码语言:javascript
复制
set aa 'liming'
  • setnx

设置 key 对应的值为 string 类型的 value。如果 key 已经存在,返回 0,否则返回1。nx 是 not exist 的意思。

代码语言:javascript
复制
setnx idig8 'idig8'setnx aa 'idig8'
  • del

删除某个key,存在返回1,不存在返回0

代码语言:javascript
复制
del idig8del aaa
  • expire

设置过期时间(单位秒),1 返回 设置成功,0 设置失败

代码语言:javascript
复制
expire aa 45expire aaa 45
  • ttl

查看剩下多少时间。返回负数则key失效,key不存在了

代码语言:javascript
复制
ttl limingexpire liming 45ttl liming
  • setex

设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期。

代码语言:javascript
复制
setex AAA 544 'sss'ttl AAA
  • mset

一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。其实实际生产中这个用处比较大,一次放入多个值,减少跟客户端的请求次数。

代码语言:javascript
复制
mset a 'a' b 'b' c 'c'
  • getset

设置 key 的值,并返回 key 的旧值。

代码语言:javascript
复制
set abc 'abc'getset abc 'abc_new'
  • mget

一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。

代码语言:javascript
复制
mget abc a b c 
  • incr

对key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一个不存在的 key,则设置 key 为 1

代码语言:javascript
复制
incr aaaincr aaaincr aaaincr aaa
  • incrby

同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0

代码语言:javascript
复制
incrby aaa 200get aaa
  • decr

对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1

代码语言:javascript
复制
decr aaadecr aaadecr aaa
  • decrby

同 decr,减指定值。

代码语言:javascript
复制
decrby aaa 100
  • append

给指定 key 的字符串值追加 value,返回新字符串值的长度。

代码语言:javascript
复制
append aaa 200get aaa
  • strlen

取指定 key 的 value 值的长度。

代码语言:javascript
复制
strlen aaa
  • persist

用于移除给定 key 的过期时间,使得 key 永不过期。

代码语言:javascript
复制
persist  aaa
  • select

默认的16个库。默认选中0库。选择数据库(0-15库)

代码语言:javascript
复制
select 0 select 1select 0 
  • move

key 迁移到 1库中

代码语言:javascript
复制
set aaaaaa 'aaaaaa'move aaaaaa 1select 1keys *
  • randomkey

随机返回一个key

代码语言:javascript
复制
randomkeyrandomkeyrandomkey
  • rename

重命名

代码语言:javascript
复制
set age 10rename age age_newget age_new
  • type

返回数据类型

代码语言:javascript
复制
get age_newtype age_new
  • ping

测试连接是否可以成功

  • quit

退出连接

  • dbsize

返回key的数量

代码语言:javascript
复制
dbsize
  • info

输出redis信息

代码语言:javascript
复制
info
  • config get|set

显示与修改配置

代码语言:javascript
复制
config get '*port*'
  • string

格式: set key value string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个键最大能存储512MB。

代码语言:javascript
复制
set abc 'abc'get abc
  • hash

格式: hmset name key1 value1 key2 value2 Redis hash 是一个键值(key=>value)对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

代码语言:javascript
复制
hmset idig8 a 'a' b 'b'hget idig8 atype idig8
  • list(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 格式: lpush name value 在 key 对应 list 的头部添加字符串元素 格式: rpush name value 在 key 对应 list 的尾部添加字符串元素 格式: lrem name index key 对应 list 中删除 count 个和 value 相同的元素 格式: llen name 返回 key 对应 list 的长度

代码语言:javascript
复制
lpush idiglist redislpush idiglist mongodblpush idiglist hbasellen idiglistlrange idiglist 0 10type idiglist
  • zset(sorted set:有序集合)

格式: zadd name score value Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 zset的成员是唯一的,但分数(score)却可以重复。

代码语言:javascript
复制
zadd idig88 1 rediszadd idig88 2 rediszadd idig88 3 javazadd idig88 4 mongodbzrangebyscore idig88 0 1000type idig88
  • 事务

并非分布式事务,这个基本用不到,但是它支持,就提下。 redis 对事务的支持目前还比较简单。redis 只能保证一个 client 发起的事务中的命令可以连续的执行,而中间不会插入其他 client 的命令。 由于 redis 是单线程来处理所有 client 的请求的所以做到这点是很容易的。一般情况下 redis 在接受到一个 client 发来的命令后会立即处理并 返回处理结果,但是当一个 client 在一个连接中发出 multi 命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到 exec 命令后,redis 会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给 client.然后此连接就 结束事务上下文。 开启事物:exec 取消事物:discard 结束事物:exec

代码语言:javascript
复制
set age 20set name 'idig8'get ageget name#开始multiincr ageincr name#执行execget ageget name
  • 发布与订阅

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的 耦合,这点和设计模式中的观察者模式比较相似。pub/sub 不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。在redis实现是SUBSCRIBE (订阅主题)、 UNSUBSCRIBE(取消主题) 和 PUBLISH(推送) 订阅

代码语言:javascript
复制
subscribe idig8

生产

代码语言:javascript
复制
publish idig8 aapublish idig8 bbb
  • 持久化

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。Redis 提供了两种持久化方式:RDB(默认) 和AOF 。 RDB: rdb是Redis DataBase缩写 RDB功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数

rdbSave函数: 将内存中的数据库数据以 RDB 格式保存到磁盘(文件)中,文件存在,那么新的 RDB 文件将替换已有的 RDB 文件。 在保存 RDB 文件期间, 主进程会被阻塞, 直到保存完成为止。 SAVE 和 BGSAVE 两个命令是操作 rdbSave函数的区别: SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。 BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。因为 rdbSave 在子进程被调用,所以 Redis 服务器在 BGSAVE 执行期间仍然可以继续处理客户端的请求。 rdbLoad函数:是redis服务重启或者启动的时候回加载保存到磁盘的RDB文件加载到内存中会被阻塞。 https://redisbook.readthedocs.io/en/latest/internal/rdb.html#id4

存储结构:

保存策略: save 900 1 save 300 10 #300 秒内容如超过 10 个 key 被修改,则发起快照保存 save 60 10000

AOF:Aof是Append-only file缩写,每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作 aof写入保存: WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件 SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。 两个步骤都需要根据一定的条件来执行,Redis提供了三种条件。

保存策略:

模式

WRITE 是否阻塞

SAVE 是否阻塞

停机时丢失的数据量

AOFFSYNCNO 不保存

阻塞

阻塞

操作系统最后一次对 AOF 文件触发 SAVE 操作之后的数据。

AOFFSYNCEVERYSEC 每一秒钟保存一次

阻塞

不阻塞

一般情况下不超过 2 秒钟的数据。

AOFFSYNCALWAYS 每执行一个命令保存一次

阻塞

阻塞

最多只丢失一个命令的数据。

存储结构: 内容是redis通讯协议(RESP )格式的命令文本存储。

总结:RDB:数据 。AOF:数据+命令。 AOF更新频率RDB高 优先加载aof。 加载的时候没有RDB(数据文件要小)快吧。

  • api太多了

直接发布文档吧,在源码里面有,直接看html文档吧

PS:常用都写了一遍,建议还是练练过一遍有点印象。命令还是很重要的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (一)Redis安装
  • (二)常用命令
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档