Redis 基础

服务器

浏览数:35

2019-5-16

1 Redis 介绍

Redis 是一个开源(BSD许可) 的, 内存中的数据结构存储系统, 它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构, 如 字符串(strings) , 散列(hashes) , 列表(lists) , 集合(sets) ,有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

Redis 内置了 复制(replication) , LUA脚本(Lua scripting) , LRU驱动事件(LRU eviction) , 事务(transactions) 和不同级别的 磁盘持久化(persistence) , 并通过 Redis哨兵(Sentinel)和自动 分区 
(Cluster)提供高可用性(high availability)

Redis 与其他 key – value 缓存产品有以下三个特点:

  1. Redis支持数据的持久化, 可以将内存中的数据保持在磁盘中, 重启的时候可以再次加载进行使用

  2. Redis不仅仅支持简单的key-value类型的数据, 同时还提供list, set, zset, hash等数据结构的存储

  3. Redis支持数据的备份, 即master-slave模式的数据备份。

 Redis 优势: 
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 
原子 – Redis的所有操作都是原子性的, 同时Redis还支持对几个操作全并后的原子性执行。 
丰富的特性 – Redis还支publish/subscribe, 通知, key 过期等等特性

2 Redis 安装

下载redis 地址

http://download.redis.io/releases/

2.1 目录规划

# 软件存放目录
/data/soft/
# redis安装目录
/opt/redis_cluster/redis_{PORT}/{conf,logs,pid}
# redis数据目录
/data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb

  

2.2 redis 安装

Redis安装命令集合

Redis安装命令集合
### 创建下载目录,安装目录和数据目录
mkdir -p /data/soft
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
### 下载软件和创建软链接
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
软连接作用方便升级 

###编译安装
cd /opt/redis_cluster/redis
make && make install

###生成配置文件和启动脚本
cd /opt/redis/utils/
./install_server.sh

###生成配置文件和启动脚本
cd /opt/redis_cluster/redis/utils/
./install_server.sh
/opt/redis_cluster/redis_6379/conf/redis.conf

/opt/redis_cluster/redis_6379/logs/redis_6379.log
/data/redis_cluster/redis_6379

  

也可以去配置文件修改

2.3 常用配置文件解释

### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.130
### 监听端口
port 6379

### pid文件和log文件的存放地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log

### 设置数据库的数量,默认数据库为0
databases 16

### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb


### 本地数据库的目录
dir /data/redis_cluster/redis_6379

  

修改完记得重启

然后启动

redis-cli -h 10.0.0.130 -p 6379

  

在一段时间内只存在于内存中。默认为no 
appendonly no

指定更新日志文件名,默认appendonly.aof 
appendfilename appendonly.aof

指定更新日志条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值) 
appendfsync everysec

  

3 redis 数据类型和基本操作

Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值

Redis keys可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。 
太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读

3.1 strings 字符串类型

这是最简单Redis类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失)。 memcache只会存字符串的类型的数据 

通常用SET command 和 GET command来设置和获取字符串值

[root@redis-130 conf]# redis-cli -h 10.0.0.130 -p 6379
10.0.0.130:6379> set mkey 123456
OK
10.0.0.130:6379> get mkey
"123456"

  

INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,类似的命令有INCRBY, DECR 和 DECRBY。实际上他们在内部就是同一个命令,只是看上去有点儿不同 
注意 INCR 是将字符串的解析成整形,所以这个字符串必须是数字才可以

10.0.0.130:6379> set couner 12c
OK
10.0.0.130:6379> get couner 
"12c"
10.0.0.130:6379> incr couner 
(error) ERR value is not an integer or out of range

10.0.0.130:6379> set counter 100
OK
10.0.0.130:6379> get counter 
"100"
10.0.0.130:6379> incr counter 
(integer) 101
10.0.0.130:6379> get counter
"101"
10.0.0.130:6379> incrby counter 10
(integer) 111
10.0.0.130:6379> get counter
"111"

  

可以一次存储或获取多个key对应的值,使用MSET和MGET命令

10.0.0.130:6379> mset a 10 b 20 c 30 
OK
10.0.0.130:6379> get a
"10"
10.0.0.130:6379> mget a b c
1) "10"
2) "20"
3) "30"

  

使用EXISTS命令返回1或0标识给定key的值是否存在,使用DEL命令可以删除key对应的值,DEL命令返回1或0标识值是被删除(值存在)或者没被删除(key对应的值不存在)。 
1 表示这个key存在 

 

10.0.0.130:6379> exists couner
(integer) 1
10.0.0.130:6379> del couner
(integer) 1
10.0.0.130:6379> exists couner
(integer) 0

  

TYPE命令可以返回key对应的值的存储类型

10.0.0.130:6379> set mykey abc
OK
10.0.0.130:6379> type mykey
string

  

可以对key设置一个超时时间,当这个时间到达后会被删除 
默认key 是永不过期 的,设置过期时间   ,例如用做 一些美团优惠券 在限定的使用 就是这个意思

10.0.0.130:6379> get mykey
"abc"
10.0.0.130:6379> ttl mykey
(integer) -1
10.0.0.130:6379> expire mykey 10
(integer) 1
10.0.0.130:6379> ttl mykey
(integer) 5
10.0.0.130:6379> ttl mykey
(integer) 3
10.0.0.130:6379> ttl mykey
(integer) 2
10.0.0.130:6379> ttl mykey
(integer) 2
10.0.0.130:6379> ttl mykey
(integer) 1
10.0.0.130:6379> ttl mykey
(integer) 0
10.0.0.130:6379> ttl mykey
(integer) -2
10.0.0.130:6379> get mykey
(nil)

  

(integer) -1 表示这个key 永不过期 
(integer) -2 表示这个key 不存在 
其他的数字表示这个还剩多少存活时间,默认是秒为单位

PERSIST命令抹掉超时时间

10.0.0.130:6379> set mykey abc ex 100
OK
10.0.0.130:6379> ttl mykey
(integer) 90
10.0.0.130:6379> persist mykey 
(integer) 1
10.0.0.130:6379> ttl mykey
(integer) -1

  

3.2 Lists 列表类型

LPUSH 命令可向list的左边(头部)添加一个新元素,而RPUSH命令可向list的右边(尾部)添加一个新元素。 
最后LRANGE 命令可从list中取出一定范围的元素:

10.0.0.130:6379> rpush mylist a 
(integer) 1
10.0.0.130:6379> rpush mylist b
(integer) 2
10.0.0.130:6379> lpush mylist first 
(integer) 3
# 取出这个key 的所有内容
10.0.0.130:6379> lrange mylist 0 -1 
1) "first"
2) "a"
3) "b"

# 从第二个到最后一个的内容 默认第一个是0
10.0.0.130:6379> lrange mylist 1 -1 
1) "a"
2) "b"
10.0.0.130:6379> lrange mylist 2 -1
1) "b"
# 跟python的list 类型相似

#一次向list存入多个值
10.0.0.130:6379> rpush mylist 1 2 3 4 5 "foo"
(integer) 9

#pop,它从list中删除元素并同时返回删除的值。可以在左边或右边操作
10.0.0.130:6379> rpop mylist
"foo"
10.0.0.130:6379> lpop mylist
"first"

  

使用LTRIM把list从左边截取指定长度

10.0.0.130:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "1"
4) "2"
5) "3"
6) "4"
7) "5"

10.0.0.130:6379> ltrim mylist 0 2
OK
10.0.0.130:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "1"

  

3.3 hash 类型

Redis hash 看起来就像一个 “hash” 的样子,由键值对组成 
HMSET 指令设置 hash 中的多个域,而 HGET 取回单个域。 HMGET 和 HGET 类似,但返回一系列值

10.0.0.130:6379> hmset user:1000 username  xixi birthyear 1998 verified 1
OK
10.0.0.130:6379> hget user:1000 username
"xixi"
10.0.0.130:6379> hmget user:1000 username birthyear
1) "xixi"
2) "1998"
10.0.0.130:6379> hgetall user:1000
1) "username"
2) "xixi"
3) "birthyear"
4) "1998"
5) "verified"
6) "1"
10.0.0.130:6379> hmset user:1000 abc 1
OK
10.0.0.130:6379> hgetall user:1000
1) "username"
2) "xixi"
3) "birthyear"
4) "1998"
5) "verified"
6) "1"
7) "abc"
8) "1"

  

设置了 redis 的一些描述信息(username, birthyear, verified, abc) 到哈希表的 user:1000

3.4 sets 无序集合类型

Redis Set 是 String 的无序排列。 SADD 指令把新的元素添加到 set 中

10.0.0.130:6379> sadd myset 1 2 3 
(integer) 3
10.0.0.130:6379> smembers myset 
1) "1"
2) "2"
3) "3"
4) "123"

  

和List类型不同的是,Set集合中不允许出现重复的元素

10.0.0.130:6379> sadd myset 1 4 
(integer) 1
10.0.0.130:6379> smembers myset
1) "1"
2) "2"
3) "3"
4) "4"
5) "123"

  

Srem用来删除指定的值

10.0.0.130:6379> srem myset 2 4
(integer) 2
10.0.0.130:6379> smembers myset
1) "1"
2) "3"
3) "123"

  

将3从myset移到myset2,从结果可以看出移动成功。

10.0.0.130:6379> smove myset myset2 3
(integer) 1
10.0.0.130:6379> smembers myset2
1) "3"
10.0.0.130:6379> smembers myset
1) "1"
2) "123"

  

myset和myset2相比,得出两者之间的差异成员

10.0.0.130:6379> sadd myset 3
(integer) 1
10.0.0.130:6379> sdiff myset myset2
1) "1"
2) "123"
10.0.0.130:6379> sdiff myset2 myset
(empty list or set)

  

计算myset和myset2集合的交集

10.0.0.130:6379> sinter myset myset2
1) "3"
10.0.0.130:6379> sinter myset2 myset
1) "3"

  

计算myset和myset2集合的并集

10.0.0.130:6379> sunion myset2 myset
1) "1"
2) "3"
3) "123"

  

3.5 sorted-sets 有序集合

Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。

#添加一个分数为1的成员
10.0.0.130:6379> zadd myzset 1 "one"
(integer) 1
#添加两个分数分别是2和3的两个成员
10.0.0.130:6379> zadd myzset 2 "two" 3 "three"
(integer) 2

#0表示第一个成员,-1表示最后一个成员。 WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员
10.0.0.130:6379> zrange myzset 0 -1 
1) "one"
2) "two"
10.0.0.130:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
#获取myzset键中成员的数量。
10.0.0.130:6379> zcard myzset 
(integer) 3
#删除成员one和two,返回实际删除成员的数量。
10.0.0.130:6379> zrem myzset one two
(integer) 2
#获取成员three的分数。返回值是字符串形式。
10.0.0.130:6379> zscore myzset three
"3"

  

推荐网址:http://redisdoc.com/index.html

 

作者:keme