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 缓存产品有以下三个特点:
-
Redis支持数据的持久化, 可以将内存中的数据保持在磁盘中, 重启的时候可以再次加载进行使用
-
Redis不仅仅支持简单的key-value类型的数据, 同时还提供list, set, zset, hash等数据结构的存储
-
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/softmkdir -p /data/redis_cluster/redis_6379mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}### 下载软件和创建软链接cd /data/soft/wget http://download.redis.io/releases/redis-3.2.9.tar.gztar 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/redismake && 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.pidlogfile /opt/redis_cluster/redis_6379/logs/redis_6379.log### 设置数据库的数量,默认数据库为0databases 16### 指定本地持久化文件的文件名,默认是dump.rdbdbfilename 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 637910.0.0.130:6379> set mkey 123456OK10.0.0.130:6379> get mkey"123456"
INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,类似的命令有INCRBY, DECR 和 DECRBY。实际上他们在内部就是同一个命令,只是看上去有点儿不同 注意 INCR 是将字符串的解析成整形,所以这个字符串必须是数字才可以
10.0.0.130:6379> set couner 12cOK10.0.0.130:6379> get couner "12c"10.0.0.130:6379> incr couner (error) ERR value is not an integer or out of range10.0.0.130:6379> set counter 100OK10.0.0.130:6379> get counter "100"10.0.0.130:6379> incr counter (integer) 10110.0.0.130:6379> get counter"101"10.0.0.130:6379> incrby counter 10(integer) 11110.0.0.130:6379> get counter"111"
可以一次存储或获取多个key对应的值,使用MSET和MGET命令
10.0.0.130:6379> mset a 10 b 20 c 30 OK10.0.0.130:6379> get a"10"10.0.0.130:6379> mget a b c1) "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) 110.0.0.130:6379> del couner(integer) 110.0.0.130:6379> exists couner(integer) 0
TYPE命令可以返回key对应的值的存储类型
10.0.0.130:6379> set mykey abcOK10.0.0.130:6379> type mykeystring
可以对key设置一个超时时间
,当这个时间到达后会被删除 默认key 是永不过期 的,设置过期时间 ,例如用做 一些美团优惠券 在限定的使用 就是这个意思
10.0.0.130:6379> get mykey"abc"10.0.0.130:6379> ttl mykey(integer) -110.0.0.130:6379> expire mykey 10(integer) 110.0.0.130:6379> ttl mykey(integer) 510.0.0.130:6379> ttl mykey(integer) 310.0.0.130:6379> ttl mykey(integer) 210.0.0.130:6379> ttl mykey(integer) 210.0.0.130:6379> ttl mykey(integer) 110.0.0.130:6379> ttl mykey(integer) 010.0.0.130:6379> ttl mykey(integer) -210.0.0.130:6379> get mykey(nil)
(integer) -1 表示这个key 永不过期 (integer) -2 表示这个key 不存在 其他的数字表示这个还剩多少存活时间,默认是秒为单位
PERSIST命令抹掉超时时间
10.0.0.130:6379> set mykey abc ex 100OK10.0.0.130:6379> ttl mykey(integer) 9010.0.0.130:6379> persist mykey (integer) 110.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) 110.0.0.130:6379> rpush mylist b(integer) 210.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"# 从第二个到最后一个的内容 默认第一个是010.0.0.130:6379> lrange mylist 1 -1 1) "a"2) "b"10.0.0.130:6379> lrange mylist 2 -11) "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 -11) "a"2) "b"3) "1"4) "2"5) "3"6) "4"7) "5"10.0.0.130:6379> ltrim mylist 0 2OK10.0.0.130:6379> lrange mylist 0 -11) "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 1OK10.0.0.130:6379> hget user:1000 username"xixi"10.0.0.130:6379> hmget user:1000 username birthyear1) "xixi"2) "1998"10.0.0.130:6379> hgetall user:10001) "username"2) "xixi"3) "birthyear"4) "1998"5) "verified"6) "1"10.0.0.130:6379> hmset user:1000 abc 1OK10.0.0.130:6379> hgetall user:10001) "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) 310.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) 110.0.0.130:6379> smembers myset1) "1"2) "2"3) "3"4) "4"5) "123"
Srem用来删除指定的值
10.0.0.130:6379> srem myset 2 4(integer) 210.0.0.130:6379> smembers myset1) "1"2) "3"3) "123"
将3从myset移到myset2,从结果可以看出移动成功。
10.0.0.130:6379> smove myset myset2 3(integer) 110.0.0.130:6379> smembers myset21) "3"10.0.0.130:6379> smembers myset1) "1"2) "123"
myset和myset2相比,得出两者之间的差异成员
10.0.0.130:6379> sadd myset 3(integer) 110.0.0.130:6379> sdiff myset myset21) "1"2) "123"10.0.0.130:6379> sdiff myset2 myset(empty list or set)
计算myset和myset2集合的交集
10.0.0.130:6379> sinter myset myset21) "3"10.0.0.130:6379> sinter myset2 myset1) "3"
计算myset和myset2集合的并集
10.0.0.130:6379> sunion myset2 myset1) "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 withscores1) "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