Redis介绍
Redis是完全开源的,遵守BSD
协议,是一个高性能的key-value
数据库.为了保证效率,数据都是缓存在内存中,他也可以周期性
的把更新的数据写入磁盘
或者把修改操作写入追加的记录文件
.
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的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行.单个操作是原子性的.多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来.
- 丰富的特性 – Redis还支持
publish
/subscribe
, 通知,key
过期等等特性.
Redis适用场景
- 1.取最新N个数的操作
- 2.排行榜应用,取
TOP N
操作 - 3.需要精确设定过期时间的应用
- 4.计数器应用
- 5.
uniq
操作,获取某段时间所有数据的排重值 - 6.实时系统,反垃圾系统
- 7.
pub
/sub
构建实时消息系统(发布与订阅) - 8.构建队列系统
- 9.缓存
Redis环境准备
这里通过docker-compose部署
mkdir -p redis
cd redis
cat >> docker-compose.yaml << EOF
version: '3'
services:
redis:
image: redis:6.0.10-alpine
ports:
- 6379:6379
container_name: redis
networks:
deploy:
ipv4_address: 172.10.0.102
aliases:
- redis
volumes:
- ./redis.conf:/etc/redis.conf
# - ./data:/data
command: redis-server /etc/redis.conf
networks:
deploy:
external: true
EOF
cat >> redis.conf << EOF
# redis的databases数量
databases 32
# redis密码
requirepass 123
EOF
# 创建本地公共网络(如果不存在)
docker network ls
docker netwok rm deploy
docker network create --driver=bridge --subnet=172.10.0.0/16 deploy
docker network inspect deploy
# 启动redis环境
docker-compose up -d
# 进入redis环境
docker exec -it redis redis-cli -h 127.0.0.1 -p 6379 -a 123
Redis数据类型
- 字符串: String
- 哈希: Hash
- 列表: List
- 集合: Set
- 有序集合: Zset (Sorted Set)
Redis数据类型 - 字符串: String
是redis
最基本的类型,你可以理解成与Memcached
一模一样的类型,一个key
对应一个value
.
类型是二进制安全的.意思是redis
的string
可以包含任何数据.比如jpg图片或者序列化的对象.
类型是Redis
最基本的数据类型,string
类型的值最大能存储512MB
.
set key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]
和get key
set 设置key对应值为string类型的value
get 获取对应key的value# 给key: name 赋值 set name "name" # 获取key: name 的值 get name # 重新给key: name 赋值,会覆盖原有值 set name "darebeat" get name
注意
: 一个键最大能存储 512MB.
setnx key value
设置key对应的值为string类型的value,如果key已经存在,返回0,此时不会覆盖原有key的值,
nx
是not exists
的意思# 接着上面的命令,如果此时重新给key: name 赋值,则不会覆盖原有值 setnx name "overwrite" get name
setex key seconds value
设置key对应的值为string类型的value,并指定此键值对应的有效期.
# 添加一个 haircolor 为 red ,并指定有效期为10秒 setex haircolor 10 red get haircolor
setrange key offset value
设置指定key的value值得子字符串
# 将126邮箱替换成gmail邮箱 set email "darebeat@126.com" get email setrange email 9 gmail.com get email
mset key value [key value ...]
一次设置多个key的值,成功返回OK,表示所有的值都设置了,失败返回0,表示没有任何值被设置.
mset key1 test1 key2 test2 key3 30 get key1 get key2 get key3
msetnx key value [key value ...]
一次设置多个key的值,成功返回OK,表示所有的值都设置了,失败返回0,表示没有任何值被设置.但是不会覆盖已经存在的key.
msetnx key3 27 key4 aaa get key3 get key4 msetnx key4 aaa key5 bbb key6 ccc get key4 get key5 get key6
getset key value
设置key的值,并返回key的旧值.
getset key3 27 get key3
getrange key start end
获取key的value值得子字符串.
getrange email 0 7
mget key [key ...]
一次获取多个key的值,如果对应key不存在,则对应返回空值(nil).
mget key3 email key10 key1
incr key
/decr key
对key的值做递增递减操作,并返回新的值.
set age 21 get age incr age get age
incrby key increment
/decrby key increment
同
incr
类似,根据指定值递增递减相应数值,key不存在的时候会设置key,并认为原来的value为0.set age 21 get age incrby age 6 incrby score -6 get age
append key value
给指定key的字符串追加value,返回新字符串值得长度.
set name darebeat get name append name @126.com get name
strlen key
取指定key的value值的长度.
strlen name
Redis数据类型 - 哈希: Hash
是一个键值(key=>value)对集合;
它的添加,删除操作都是O(1)(平均);
是一个string
类型的field
和value
的映射表,hash
特别适合用于存储对象;
相较于将对象的每个字段存储成string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象.
注意
: 每个hash
可以存储2^32-1
键值对(40多亿)
hset key field value [field value ...]
和hget key field
设置hash field为指定值,如果key不存在,则先创建.
hset myhash field1 Hello hget myhash field1
hsetnx key field value
设置hash field为指定值,如果key不存在,则先创建.如果存在返回0,不覆盖原有值.
hsetnx user:001 name "test" hsetnx user:001 name "darebeat" hget user:001 name
hmset key field value [field value ...]
和hmget key field [field ...]
同时设置和获取hash的多个field.
# hmset, hget 命令 # hmset 设置了两个 field=>value 对, hget 获取对应 field 对应的 value hmset user:002 name "darebeat" age "27" hmget user:002 name age
hincrby key field increment
根据指定值递增递减相应数值,field不存在的时候会设置field,并认为原来的value为0.
hincrby user:002 age 3 hincrby user:002 sex 1 hmget user:002 age sex
hexists key field
测试hash中field是否存在.
hexists user:002 weight
hlen key
返回指定hash的field数量
hlen user:002
hdel key field [field ...]
删除指定hash的field.
hdel user:002 age hget user:002 age
hkeys key
和hvals key
返回hash的所有field和value.
hkeys user:002 hvals user:002
hgetall key
获取某个hash中全部field和value.
hgetall user:002
Redis数据类型 - 列表: List
List是一个链表结构,主要功能是push,pop,获取一个范围的所有值等;操作中key理解为链表名字.
是一个每个子元素都是string类型双向链表.
可以通过push,pop操作从链表的头部或尾部添加删除元素,这样list既可以作为栈,又可以作为队列.
lpush key element [element ...]
在key对应的list头部添加字符串元素.这是一个栈结构,后进先出.
lpush list1 "Hello" lpush list1 "World" lrange list1 0 -1
rpush key element [element ...]
在key对应的list尾部添加字符串元素.这是一个队列结构,先进先出.
rpush list2 "one" rpush list2 "two" rpush list2 "three" lrange list2 0 -1
linsert key BEFORE|AFTER pivot element
在key对应的list的特定位置前或后添加字符串.
rpush list3 "World" linsert list3 before "World" "Hello" linsert list3 after "World" "!" lrange list3 0 -1
lset key index element
设置list中指定下标的元素值.
lset list3 2 "?" lrange list3 0 -1
lrem key count element
从key对应list中删除n个和value相同的元素.(n<0从尾部删除,n=0则全部删除)
rpush list4 "hello" rpush list4 "hello" lrem list4 1 "hello" lrange list4 0 -1
ltrim key start stop
保留指定key的值范围内的数据.
rpush list5 "one" rpush list5 "two" rpush list5 "three" rpush list5 "four" ltrim list5 1 -1 lrange list5 0 -1
lpop key
和rpop key
从list的头部或尾部删除元素,并返回删除元素.
lpop list5 lrange list5 0 -1
rpoplpush source destination
从第一个list的尾部移除元素并添加到第二个list的头部.
lrange list2 0 -1 lrange list3 0 -1 rpoplpush list2 list3 lrange list2 0 -1 lrange list3 0 -1
lindex key index
返回名称为key的list中index位置的元素.
lindex list3 1
Redis数据类型 - 集合: Set
Set是集合,它是string类型的无序集合;
通过hash table
实现添加,删除和查找,复杂度都是O(1);
对集合我们可以取并集,交集,差集;通过这些功能,实现sns中的好友推荐和blog的tag功能.
sadd key member [member ...]
向集合添加一个或多个成员.
sadd set0 hello xxx vvvv sadd set0 world sadd set0 world
smembers key
查看set中的元素.
smembers set0
scard key
获取集合的成员数.
scard set0
srem key member [member ...]
移除集合中一个或多个成员.
sadd set1 one sadd set1 two sadd set1 three smembers set1 srem set1 two smembers set1
spop key
随机返回并删除名称为key的set中的一个元素.
sadd set2 one sadd set2 two sadd set2 three sadd set2 four sadd set2 five smembers set2 spop set2 spop set2
sdiff key [key ...]
返回所有给定key与第一个key的差集.
sdiff set1 set2 sdiff set2 set1
sdiffstore destination key [key ...]
返回所有给定key与第一个key的差集,并将结果存到另一个destination.
sdiffstore setres1 set2 set1 smembers setres1
sinter key [key ...]
返回所有给定key的交集.
sadd set1 nine sadd set2 nine sadd set3 nine sinter set1 set2 sinter set1 set2 set3
sinterstore destination key [key ...]
返回所有给定key的交集,并将结果存到另一个destination.
sinterstore setres2 set1 set2 set3 smembers setres2
sunion key [key ...]
返回所有给定key的并集.
sunion set1 set2
sunionstore destination key [key ...]
返回所有给定key的并集,并将结果存到另一个destination.
sunionstore setres3 set1 set2 set3 smembers setres3
smove source destination member
从第一个source对应的set中移除member并添加到第二个destination对应的set中.
sadd set1 ten smembers set1 smove set1 set3 ten smembers set1 smembers set3
sismember key member
测试member是否是名称为key的set中的元素.
sismember set3 ten sismember set3 one
srandmember key [count]
随机返回名称为key的set中的一个或多个元素,但不删除元素.
srandmember setres3 srandmember setres3 2
Redis数据类型 - 有序集合: Zset
和set
一样也是string
类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double
类型的分数.redis
正是通过分数来为集合中的成员进行从小到大的排序.
有序集合的成员是唯一的,但分数(score)却可以重复.
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
. 集合中最大的成员数为2^32-1
(4294967295, 每个集合可存储40多亿个成员).
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
向有序集合添加一个或多个成员,或者更新已存在成员的分数.
zadd zset0 0 one zadd zset0 1 two zadd zset0 2 three zadd zset0 3 four zadd zset0 4 five
zrange key start stop [WITHSCORES]
通过索引区间返回有序集合指定区间内的成员
zrange zset0 0 -1 withscores
zrevrange key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到低
zrevrange zset0 0 -1 withscores
zcard key
获取有序集合的成员数.
zcard zset0
zcount key min max
计算在有序集合中指定区间分数的成员数
zcount zset0 0 2
zincrby key increment member
有序集合中对指定成员的分数加上增量 increment.
zincrby zset1 2 age zrange zset1 0 -1 withscores
zrank key member
返回有序集合中指定成员的索引.
zrank zset0 one zrank zset0 two zrank zset0 three
zrevrank key member
返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
zrevrank zset0 one zrevrank zset0 two zrevrank zset0 three
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
通过分数返回有序集合指定区间内的成员
zrangebyscore zset0 1 4 withscores
zrevrangebyscore key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
zrevrangebyscore zset0 5 0 withscores
zscore key member
返回有序集中,成员的分数值
ZSCORE zset0 one ZSCORE zset0 two
zunionstore destination numkeys key [key ...]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
zadd zset1 0 10 zadd zset1 1 11 zadd zset2 0 11 zadd zset2 1 12 zunionstore zsetres1 3 zset1 zset2 zset0 zrange zsetres1 0 -1 withscores
zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中.
zinterstore zsetres2 2 zset1 zset2 zrange zsetres2 0 -1 withscores
zlexcount key min max
在有序集合中计算指定字典区间内成员数量
zadd chars 2 a 2 b 2 c 3 d 3 e zadd chars 4 f 4 g 5 h 5 i zlexcount chars - + zlexcount chars [b [f zlexcount chars (b (f
zrangebylex key min max [LIMIT offset count]
通过字典区间返回有序集合的成员
zrangebylex chars - + zrangebylex chars [c +
zrem key member [member ...]
移除有序集合中的一个或多个成员
zrem zset0 one two zrange zset0 0 -1 withscores
zremrangebylex key min max
移除有序集合中给定的字典区间的所有成员
zremrangebylex chars (c (f zrange chars 0 -1 withscores
zremrangebyrank key start stop
移除有序集合中给定的排名区间的所有成员
zadd site 8 "darebeat.cn" 7 "www.darebeat.cn" 2 "baidu.com" 3 "qq.com" zremrangebyrank site 0 1 zrange site 0 -1 withscores
zremrangebyscore key min max
移除有序集合中给定的分数区间的所有成员
zadd site1 8 "darebeat.cn" 7 "www.darebeat.cn" 2 "baidu.com" 3 "qq.com" zremrangebyscore site1 7 8 # 移除所有score在7到8 zrange site1 0 -1 withscores