一、什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型下:
字符串类型
散列类型
列表类型
集合类型
有序集合类型。
二、Redis应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
三、Redis数据类型
3.1、String
Key'[{"CityId":18,"CityName":"xian","ProvinceId":27,"CityOrder":1},{"CityId":53,"CityName":"guangzhou","ProvinceId":27,"CityOrder":1}]'
最为基础的数据存储类型。可以存储字符串和二进制数据,在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
|
命令 |
描述 |
例子 |
|
set |
赋值 |
set key value |
|
get |
获取值 |
get key |
|
append |
追加字符串 |
append key value |
|
decr |
减少值 |
decr key |
|
incr |
增加值 |
incr key |
|
decrby |
设置减少数值的步长 |
decrby key decrement |
|
incrby |
设置增加数值的步长 |
incrby key increment |
|
getset |
先获取值再赋值,原子性操作 |
getset key value |
|
strlen |
返回key的长度 |
strlen key |
|
setex |
设置key在服务器中存在的时间 |
setex key seconds value |
|
setnx |
key不存在设置值,否则不做操作 |
setnx key value |
|
setrange |
字符串替换 |
setrange key start "value" |
|
getrange |
截取字符串 |
getrange key start end |
|
setbit |
设置二进制的值 |
setbit key offset value |
|
getbit |
获取二进制的值 |
getbit key offset |
|
mget |
返回多个key的值 |
mget key [key ...] |
|
mset |
设置多个key、value |
mset key value [key value ...] |
|
msetnx |
key不存在设置多个key、value值,否则不做操作 |
msetnx key value [key value ...] |
赋值与取值:
SET key value
GET key
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> get test
"123“
当键不存在时返回空结果。
递增数字
INCR key
当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
减少指定的整数
DECR key
DECRBY key decrement
示例:
127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> decr num
(integer) 5
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> decrby num 3
(integer) -1
APPEND key value
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str
"hello world!"
STRLEN key
STRLEN命令返回键值的长度,如果键不存在则返回0。
127.0.0.1:6379> strlen str
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str
(integer) 5
MSET key value [key value …]
MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k1 k3
1) "v1"
2) "v3"
3.2、List
List类型是按照插入顺序排序的字符串链表(相当于java的linkedlist)。可以在链表的两头插入或删除元素,List中可以包含的最大元素数量是4294967295。
|
命令 |
描述 |
例子 |
|
lpush |
在list头部添加多个值 |
lpush key value [value ...] |
|
lpushx |
key存在则添加值,否则不做操作 |
lpushx key value |
|
lrange |
遍历list中key数据 |
lrange key start stop |
|
lpop |
从头部弹出key中的值 |
lpop key |
|
llen |
返回key的长度 |
llen key |
|
lrem |
删除前面几个值等于某值得元素 |
lrem key count value |
|
lset |
给下标赋值 |
lset key value |
|
lindex |
返回下标中的值 |
lindex key index |
|
ltrim |
截取list中的值 |
ltrim key start stop |
|
linsert |
在某个值的前面或者后面插入值 |
linsert key before|after pivot value |
|
rpush |
在list尾部添加多个值 |
rpush key value [value ...] |
|
rpushx |
在list尾部添加单个值 |
rpushx key value |
|
rpop key |
从尾部弹出值 |
rpop key |
|
rpoplpush |
从一个集合尾部弹出值插入到里一个集合的头部 |
rpoplpush source destination |
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
向列表左边增加元素
127.0.0.1:6379> lpush list:1 1 2 3
(integer) 3
向列表右边增加元素
127.0.0.1:6379> rpush list:1 4 5 6
(integer) 3
LPOP命令从列表左边弹出一个元素,会分两步完成,第一步是将列表左边的元素从列表中移除,第二步是返回被移除的元素值。
127.0.0.1:6379> lpop list:1
"3“
127.0.0.1:6379> rpop list:1
"6“
127.0.0.1:6379> llen list:1
(integer) 2
获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
127.0.0.1:6379> lrange list:1 0 2
1) "2"
2) "1"
3) "4"
在redis中创建商品评论列表:
用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。
定义商品评论列表key:
商品编号为1001的商品评论key:items:comment:1001
192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不错,很好!!","date":1430295077289}'
3.3、Hash
Hashes类型可以看成具有String Key和String Value的map容器(就相当于java中的hashmap类型)。非常适合于存储值对象的信息。如Username、Password和Age等。
|
命令 |
描述 |
例子 |
|
hset |
给key中filed字段赋值 |
hset key field value |
|
hget |
获取key中filed的值 |
hget key field |
|
hexists |
判断filed是否存在 0 、1 |
hexists key field |
|
hlen |
获取key 的长度 |
hlen key |
|
hdel |
删除file字段 |
hdel key field [field ...] |
|
hsetnx |
如果filed不存赋值否则不做操作 |
hsetnx key field value |
|
hincrby |
给filed增加步长 |
hincrby key field increment |
|
hgetall |
获取所有的filed和value |
hgetall key |
|
hkeys |
获取key |
hkeys key |
|
hvals |
获取value |
hvals key |
|
hmget |
获取所有filed字段的值 |
hmget key field [field ...] |
|
hmset |
设置多个filed字段value |
hmset key field value [field value ...] |
HSET key field value 一次只能设置一个字段值
HGET key field 一次只能获取一个字段值
HMSET key field value [field value ...] 一次可以设置多个字段值
HMGET key field [field ...] 一次可以获取多个字段值
HGETALL key
127.0.0.1:6379> hset user username zhangsan
(integer) 1
127.0.0.1:6379> hget user username
"zhangsan“
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0.
127.0.0.1:6379> hmset user age 20 username lisi
OK
127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"
127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"
127.0.0.1:6379> hexists user age 查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name 查看user中是否有name字段
(integer) 0
HSETNX key field value
当字段不存在时赋值,类似HSET,区别在于如果字段已经存在,该命令不执行任何操作。
127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作
(integer) 0
127.0.0.1:6379> hincrby user age 2 将用户的年龄加2
(integer) 22
127.0.0.1:6379> hget user age 获取用户的年龄
"22“
商品id、商品名称、商品描述、商品库存、商品好评
定义商品信息的key:
商品1001的信息在 redis中的key为:items:1001
存储商品信息
192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9
OK
获取商品信息
192.168.101.3:7003> HGET items:1001 id
"3"
192.168.101.3:7003> HGETALL items:1001
1) "id"
2) "3"
3) "name"
4) "apple"
5) "price"
6) "999.9"
3.4、Set
Set类型看作为没有排序的字符集合,Set集合中不允许出现重复的元素,redis可以在服务器端完成多个Sets之间的计算操作,如unions、intersections和differences。这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销
|
命令 |
描述 |
例子 |
|
sadd |
添加值 |
sadd key member [member ...] |
|
smembers |
遍历集合 |
smembers key |
|
scard |
获取key的成员数量 |
scard key |
|
sismember |
判断成员是否存在 |
sismember key member |
|
spop |
随机弹出值 |
spop key |
|
srem |
删除指定的成员 |
srem key member [member ...] |
|
srandmember |
随机返回成员,不删除原值 |
srandmember key |
|
smove |
移动一个集合的成员到另一个集合 |
smove source destination member |
|
sdiff |
求集合差集 |
sdiff key [key ...] |
|
sdiffstore |
集合中的差集存储到新集合中 |
sdiffstore destination key [key ...] |
|
sinter |
求集合交集 |
sinter key [key ...] |
|
sinterstore |
将集合交集存储到新集合 |
sinterstore destination key [key ...] |
|
sunion |
求集合并集 |
sunion key [key ...] |
|
sunionstore |
将集合的并集存储到新集合 |
sunionstore destination key [key ...] |
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
127.0.0.1:6379> srem set c d
(integer) 1
获取集合所有元素:
127.0.0.1:6379> smembers set
1) "b"
2) "a”
判断元素是否在集合中,无论集合中有多少元素都可以极速的返回结果。
SISMEMBER key member
127.0.0.1:6379> sismember set a
(integer) 1
127.0.0.1:6379> sismember set h
(integer) 0
属于A并且不属于B的元素构成的集合。
127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB
1) "1"
127.0.0.1:6379> sdiff setB setA
1) "4"
127.0.0.1:6379> sinter setA setB
1) "2"
2) "3"
127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
不允许出现重复的元素,每一个成员都会有一个分数(score)与之关联,用分数来进行排序,分数是可以重复的
|
命令 |
描述 |
例子 |
|
zadd |
添加排序成员 |
zadd key score member [score] [member] |
|
zcard |
获取成员数量 |
zcard key |
|
zcount |
获取分数在min和max之间成员有多少个 |
zcount key min max |
|
zincrby |
增加指定成员的分数 |
zincrby key increment member |
|
zrange |
遍历成员以及分数 |
zrange key start stop [withscores] |
|
zrangebyscore |
返回分数在min和max之间的成员和分数 |
zrangebyscore key min max [withscores] |
|
zrank |
返回成员的下标 |
zrank key member |
|
zrem |
删除指定成员 |
zrem key member [member ...] |
|
zrevrange |
遍历成员以及分数从大到小 |
zrevrange key start stop [withscores] |
|
zrevrank |
返回成员下标顺序从大到小 |
zrevrank key member |
|
zscore |
获取指定成员的分数 |
zscore key member |
|
zrevrangebyscore |
获取成员以及分数按照从高到低 |
zrevrangebyscore key max min [withscores] |
|
zremrangebyrank |
删除下标之间的数据 |
zremrangebyrank key start stop |
|
zremrangebyscore |
删除分数在min和max中的成员 |
zremrangebyscore key min max |
127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer) 0
获取元素的分数
ZSCORE key member
127.0.0.1:6379> zscore scoreboard lisi
"97"
照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
127.0.0.1:6379> zrange scoreboard 0 2
1) "zhangsan"
2) "wangwu"
3) "lisi“
照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
127.0.0.1:6379> zrevrange scoreboard 0 2
1) " lisi "
2) "wangwu"
3) " zhangsan “
如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"
给lisi加4分
127.0.0.1:6379> ZINCRBY scoreboard 4 lisi
"101“
获得集合中元素的数量
127.0.0.1:6379> ZCARD scoreboard
(integer) 3
获得指定分数范围内的元素个数
127.0.0.1:6379> ZCOUNT scoreboard 80 90
(integer) 1
根据商品销售量对商品进行排行显示,定义sorted set集合,商品销售量为元素的分数。
定义商品销售排行榜key:items:sellsort
写入商品销售量:
商品编号1001的销量是9,商品编号1002的销量是10
192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002
商品编号1001的销量加1
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
商品销量前10名:
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
3.6、 对于key的应用命令
|
命令 |
描述 |
例子 |
|
keys |
获取所有的key |
keys pattern |
|
del |
删除指定的key |
del key [key ...] |
|
exists |
判断key是否存在 |
exists key |
|
move |
移动一个key到另一个库中 |
move key db |
|
rename |
给key从新命名 |
rename key newkey |
|
renamenx |
修改key的名字 |
renamenx key newkey |
|
persist |
持久化key |
persist key |
|
expire |
设置key存活时间 |
expire key seconds |
|
expireat |
设置key存活时间(年月日) |
expireat key timestamp |
|
ttl |
实时查看key存活时间 |
ttl key |
|
randomkey |
随机返回一个key |
randomkey |
|
type |
查看key的中value数据类型 |
type key |
|
select |
进入指定库 |
select num |
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。
192.168.101.3:7002> set test 1 设置test的值为1
OK
192.168.101.3:7002> get test 获取test的值
"1"
192.168.101.3:7002> EXPIRE test 5 设置test的生存时间为5秒
(integer) 1
192.168.101.3:7002> TTL test 查看test的生于生成时间还有1秒删除
(integer) 1
192.168.101.3:7002> TTL test
(integer) -2
192.168.101.3:7002> get test 获取test的值,已经删除
(nil)
返回满足给定pattern 的所有key
redis 127.0.0.1:6379> keys mylist*
1) "mylist"
2) "mylist5"
3) "mylist6"
删除一个key
redis 127.0.0.1:6379> del age
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 0
3.7、消息发布、订阅
什么是消息:qq聊天、发个邮件、手机短信都可以称为消息
什么是发布:A发一个消息给B,A就是在发布消
什么是订阅:B要想接收到A的消息需要添加A为好友,添加好友就是订阅
场景:常用于构建类似在线聊天应用,网站内部消息系统
命令:
发布频道消息:publish news 'today is sunshine'
订阅频道:subscribe news
批量订阅:psubscribe new*
&spm=1001.2101.3001.5002&articleId=49868521&d=1&t=3&u=10c79c047b5e44ab9c3c77cb5aca2b24)
591

被折叠的 条评论
为什么被折叠?



