学会这15点,让你分分钟拿下Redis数据库数据库

来源:互联网 / 作者:SKY / 2018-06-20 01:06 / 点击:
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 Key-Value 存储系统。

学会这15点,让你分分钟拿下Redis数据库

Redis 简介

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。

它通常被称为数据结构服务器,因为值(value)可以是字符串(String),哈希(Map),列表(list),集合(sets) 和有序集合(sorted sets)等类型。

大家都知道 Redis 是基于 Key-Value 的 NoSQL 数据库,因此,先来了解一下关于 Key 相关的知识点:

任何二进制的序列都可以作为 key 使用

Redis 有统一的规则来设计 key

对 Key-Value 允许的最大长度是 512MB

支持的语言

ActionScript Bash  C  C#  C++  Clojure Common Lisp 

Crystal  D  Dart  Elixir  emacs  lisp  Erlang   

Fancy  gawk  GNU Prolog  Go  Haskell  Haxe  Io Java  Javascript   

Julia  Lua  Matlab  mruby  Nim  Node.js  Objective-C   

OCaml Pascal  Perl  PHP  Pure Data  Python  R  Racket   

Rebol  Ruby  Rust Scala  Scheme  Smalltalk  Swift  Tcl  VB  VCL 

Redis 的应用场景到底有哪些?

最常用的就是会话缓存

消息队列,比如支付

活动排行榜或计数

发布、订阅消息(消息通知)

商品列表、评论列表等

Redis 安装

关于 Redis 安装与相关的知识点介绍请参考:Nosql数据库服务之redis

安装的大概步骤如下:

Redis 是 C 语言开发的,安装 Redis 需要 C 语言的编译环境,如果没有 gcc 需要在线安装:yum install gcc-c++

第一步,获取源码包:wget

第二步,解压缩 Redis:tar zxvf redis-3.0.0.tar.gz

第三步,编译。进入redis源码目录(cd redis-3.0.0)。执行 make

第四步,安装。make install PREFIX=/usr/local/redis

#PREFIX 参数指定 Redis 的安装目录

Redis 数据类型

Redis 一共支持五种数据类型:

string(字符串)

hash(哈希)

list(列表)

set(集合)

zset(sorted set 有序集合)

String(字符串):它是 Redis 最基本的数据类型,一个 Key 对应一个 Value,需要注意是一个键值最大存储 512MB。

127.0.0.1:6379> set key "hello world" 

OK 

127.0.0.1:6379> get key 

"hello world" 

127.0.0.1:6379> getset key "nihao" 

"hello world" 

127.0.0.1:6379> mset key1 "hi" key2 "nihao" key3 "hello" 

OK 

127.0.0.1:6379> get key1 

"hi" 

127.0.0.1:6379> get key2 

"nihao" 

127.0.0.1:6379> get key3 

"hello" 

相关命令介绍:

set 为一个 Key 设置 Value(值) 

get 获得某个 Key 对应的 Value(值)

getset 为一个 Key 设置 Value(值)并返回对应的值

mset 为多个 Key 设置 Value(值)

Hash(哈希):Redis Hash是一个键值对的集合, 是一个 String 类型的 Field 和 Value 的映射表,适合用于存储对象。

127.0.0.1:6379> hset redishash 1 "001" 

(integer) 1 

127.0.0.1:6379> hget redishash 1 

"001" 

127.0.0.1:6379> hmset redishash 1 "001" 2 "002" 

OK 

127.0.0.1:6379> hget redishash 1 

"001" 

127.0.0.1:6379> hget redishash 2 

"002" 

127.0.0.1:6379> hmget redishash 1 2 

1) "001" 

2) "002" 

相关命令介绍:

hset 将 Key 对应的 Hash 中的 Field 配置为 Value,如果 Hash 不存则自动创建

hget 获得某个 Hash 中的 Field 配置的值

hmset 批量配置同一个 Hash 中的多个 Field 值

hmget 批量获得同一个 Hash 中的多个 Field 值

List(列表):是 Redis 简单的字符串列表,它按插入顺序排序。

127.0.0.1:6379> lpush word  hi 

(integer) 1 

127.0.0.1:6379> lpush word  hello 

(integer) 2 

127.0.0.1:6379> rpush word  world 

(integer) 3 

127.0.0.1:6379> lrange word 0 2 

1) "hello" 

2) "hi" 

3) "world" 

127.0.0.1:6379> llen word 

(integer) 3 

相关命令介绍:

lpush 向指定的列表左侧插入元素,返回插入后列表的长度

rpush 向指定的列表右侧插入元素,返回插入后列表的长度

llen 返回指定列表的长度

lrange 返回指定列表中指定范围的元素值

Set(集合):是 String 类型的无序集合,也不可重复。

127.0.0.1:6379> sadd redis redisset 

(integer) 1 

127.0.0.1:6379> sadd redis redisset1 

(integer) 1 

127.0.0.1:6379> sadd redis redisset2 

(integer) 1 

127.0.0.1:6379> smembers redis 

1) "redisset1" 

2) "redisset" 

3) "redisset2" 

127.0.0.1:6379> sadd redis redisset2 

(integer) 0 

127.0.0.1:6379> smembers redis 

1) "redisset1" 

2) "redisset" 

3) "redisset2" 

127.0.0.1:6379> smembers redis 

1) "redisset1" 

2) "redisset3" 

3) "redisset" 

4) "redisset2" 

127.0.0.1:6379> srem redis redisset 

(integer) 1 

127.0.0.1:6379> smembers redis 

1) "redisset1" 

2) "redisset3" 

3) "redisset2" 

相关命令介绍:

sadd 添加一个 String 元素到 Key 对应的 set 集合中,成功返回 1,如果元素存在返回 0

smembers 返回指定的集合中所有的元素

srem 删除指定集合的某个元素

Zset(sorted set 有序集合):是 String 类型的有序集合,也不可重复。

sorted set 中的每个元素都需要指定一个分数,根据分数对元素进行升序排序,如果多个元素有相同的分数,则以字典序进行升序排序,sorted set 因此非常适合实现排名。

127.0.0.1:6379> zadd nosql 0 001 

(integer) 1 

127.0.0.1:6379> zadd nosql 0 002 

(integer) 1 

127.0.0.1:6379> zadd nosql 0 003 

(integer) 1 

127.0.0.1:6379> zcount nosql 0 0  

(integer) 3 

127.0.0.1:6379> zcount nosql 0 3 

(integer) 3 

127.0.0.1:6379> zrem nosql 002 

(integer) 1 

127.0.0.1:6379> zcount nosql 0 3 

(integer) 2 

127.0.0.1:6379> zscore nosql 003 

"0" 

127.0.0.1:6379> zrangebyscore nosql 0 10 

1) "001" 

2) "003" 

127.0.0.1:6379> zadd nosql 1 003 

(integer) 0 

127.0.0.1:6379> zadd nosql 1 004 

(integer) 1 

127.0.0.1:6379> zrangebyscore nosql 0 10 

1) "001" 

2) "003" 

3) "004" 

127.0.0.1:6379> zadd nosql 3 005 

(integer) 1 

127.0.0.1:6379> zadd nosql 2 006 

(integer) 1 

127.0.0.1:6379> zrangebyscore nosql 0 10 

1) "001" 

2) "003" 

3) "004" 

4) "006" 

5) "005" 

相关命令介绍:

zadd 向指定的 sorteset 中添加 1 个或多个元素

zrem 从指定的 sorteset 中删除 1 个或多个元素

zcount 查看指定的 sorteset 中指定分数范围内的元素数量

zscore 查看指定的 sorteset 中指定分数的元素

zrangebyscore 查看指定的 sorteset 中指定分数范围内的所有元素

键值相关的命令

127.0.0.1:6379> exists key 

(integer) 1 

127.0.0.1:6379> exists key1 

(integer) 1 

127.0.0.1:6379> exists key100 

(integer) 0 

127.0.0.1:6379> get key 

"nihao,hello" 

127.0.0.1:6379> get key1 

"hi" 

127.0.0.1:6379> del key1 

(integer) 1 

127.0.0.1:6379> get key1 

(nil) 

127.0.0.1:6379> rename key key0 

OK 

127.0.0.1:6379> get key 

(nil) 

127.0.0.1:6379> get key0 

"nihao,hello" 

127.0.0.1:6379> type key0 

string 

exists:#确认 Key 是否存在

del:#删除 Key

expire:#设置 Key 过期时间(单位秒)

persist:#移除 Key 过期时间的配置

rename:#重命名 Key

type:#返回值的类型

Redis 服务相关的命令

127.0.0.1:6379> select 0 

OK 

127.0.0.1:6379> info 

# Server 

redis_version:3.0.6 

redis_git_sha1:00000000 

redis_git_dirty:0 

redis_build_id:347e3eeef5029f3 

redis_mode:standalone 

os:Linux 3.10.0-693.el7.x86_64 x86_64 

arch_bits:64 

multiplexing_api:epoll 

gcc_version:4.8.5 

process_id:31197 

run_id:8b6ec6ad5035f5df0b94454e199511084ac6fb12 

tcp_port:6379 

uptime_in_seconds:8514 

uptime_in_days:0 

hz:10 

lru_clock:14015928 

config_file:/usr/local/redis/redis.conf 

-------------------省略N行 

127.0.0.1:6379> CONFIG GET 0 

(empty list or set

127.0.0.1:6379> CONFIG GET 15 

(empty list or set

slect:#选择数据库(数据库编号 0-15)

quit:#退出连接

info:#获得服务的信息与统计

monitor:#实时监控

config get:#获得服务配置

flushdb:#删除当前选择的数据库中的 Key

flushall:#删除所有数据库中的 Key

Redis 的发布与订阅

Redis 发布与订阅(pub/sub)是它的一种消息通信模式,一方发送信息,一方接收信息。

下图是三个客户端同时订阅同一个频道:

学会这15点,让你分分钟拿下Redis数据库

下图是有新信息发送给频道 1 时,就会将消息发送给订阅它的三个客户端:

学会这15点,让你分分钟拿下Redis数据库

Redis 事务

Redis 事务可以一次执行多条命令:

发送 exec 命令前放入队列缓存,结束事务

收到 exec 命令后执行事务操作,如果某一命令执行失败,其它命令仍可继续执行

一个事务执行的过程中,其它客户端提交的请求不会被插入到事务执行的命令列表中

一个事务经历三个阶段:

开始事务(命令:multi)

命令执行

结束事务(命令:exec)

127.0.0.1:6379> MULTI 

OK 

127.0.0.1:6379> set key key1 

QUEUED 

127.0.0.1:6379> get key 

QUEUED 

127.0.0.1:6379> rename key key001 

QUEUED 

127.0.0.1:6379> exec 

1) OK 

2) "key1" 

3) OK 

Redis 安全配置

可以通过修改配置文件设备密码参数来提高安全性:#requirepass foobared。

去掉注释#号就可以配置密码,没有配置密码的情况下查询如下:

127.0.0.1:6379> CONFIG GET requirepass  

1) "requirepass"  

2) "" 

配置密码之后,就需要进行认证:

127.0.0.1:6379> CONFIG GET requirepass 

(error) NOAUTH Authentication required. 

127.0.0.1:6379> AUTH foobared #认证 

OK 

127.0.0.1:6379> CONFIG GET requirepass 

1) "requirepass" 

2) "foobared" 

Redis 持久化

Redis 持久有两种方式:

Snapshotting(快照)

Append-only file(AOF)

Snapshotting(快照):

将存储在内存的数据以快照的方式写入二进制文件中,如默认 dump.rdb中。

save 900 1,#900 秒内如果超过 1 个 Key 被修改,则启动快照保存。

save 300 10,#300 秒内如果超过 10 个 Key 被修改,则启动快照保存。

save 60 10000,#60 秒内如果超过 10000 个 Key 被修改,则启动快照保存。

Append-only file(AOF):

使用 AOF 持久时,服务会将每个收到的写命令通过 write 函数追加到文件中(appendonly.aof)

AOF 持久化存储方式参数说明:

appendonly yes,#开启 AOF 持久化存储方式

appendfsync always,#收到写命令后就立即写入磁盘,效率最差,效果最好

appendfsync everysec,#每秒写入磁盘一次,效率与效果居中

appendfsync no,#完全依赖 OS,效率最佳,效果没法保证

Redis 性能测试

自带相关测试工具:

[root@test ~]# redis-benchmark --help 

Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] 

 

 -h <hostname>      Server hostname (default 127.0.0.1) 

 -p <port>          Server port (default 6379) 

 -s <socket>        Server socket (overrides host and port) 

阅读延展

1
3