您的位置:首页 > 数据库 > Redis

Redis学习笔记(一)

2015-11-16 17:02 615 查看

一、什么是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 ...]

添加删除set集合元素:

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:

属于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"

交集运算A∩B:

127.0.0.1:6379> sinter setA setB 

1) "2"

2) "3"

并集运算A∪B:

127.0.0.1:6379> sunion setA setB

1) "1"

2) "2"

3) "3"

4) "4"

3.5、Sortedset

不允许出现重复的元素,每一个成员都会有一个分数(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的应用命令

用对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*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: