Redis基础
一、什么是RedisRedis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型下:字符串类型散列类型列表类型集合类型有序集合类型。二、Redis应用场景缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)分布式集群架构中的session分离。聊天室的在线好友列表。任务队列。(秒杀
一、什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型下:
字符串类型
散列类型
列表类型
集合类型
有序集合类型。
二、Redis应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
常用命令
redis的常用命令主要分为两个方面、一个是键值相关命令、一个是服务器相关命令
1、键值相关命令
keys * 取出当前所有的key
exists name 查看n是否有name这个key
del name 删除key name
expire confirm 100 设置confirm这个key100秒过期
ttl confirm 获取confirm 这个key的有效时长
select 0 选择到0数据库 redis默认的数据库是0~15一共16个数据库
move confirm 1 将当前数据库中的key移动到其他的数据库中,这里就是把confire这个key从当前数据库中移动到1中
persist confirm 移除confirm这个key的过期时间
randomkey 随机返回数据库里面的一个key
rename key2 key3 重命名key2 为key3
type key2 返回key的数据类型
2、服务器相关命令
ping PONG返回响应是否连接成功
echo 在命令行打印一些内容
select 0~15 编号的数据库
quit /exit 退出客户端
dbsize 返回当前数据库中所有key的数量
info 返回redis的相关信息
config get dir/* 实时传储收到的请求
flushdb 删除当前选择数据库中的所有key
flushall 删除所有数据库中的数据库
三、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*
文章转载自http://blog.csdn.net/sd4422739/article/details/49868521
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)