Redis 基础
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/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