安装redis
启动redis
在安装目录的bin目录下启动redis服务器
[root@localhost ~]# cd /usr/local/redis-3.0.0/bin
[root@localhost bin]# ./redis-server redis.conf
[root@localhost bin]# ./redis-cli -h 127.0.0.0 -p 6379
如果不指定端口号也可以
[root@hadoop bin]# ./redis-cli
127.0.0.1:6379> quit // 退出
关闭redis
[root@localhost bin]# ./redis-cli shutdown
Redis数据类型
Redis中存储数据是通过key-value存储的,对于value类型有以下几种:
- 字符串
- Hash类型
- List
- Set
- SortedSet(zset)
在redis中的命令语句中,命令是忽略大小写的,但key是不忽略大小写的
String类型
- 赋值
127.0.0.1:6379>set test 123
- 取值
127.0.0.1:6379>get test
- 设置/获取多个键值对
127.0.0.1:6379>mset k1 v1 k2 v2 k3 v3
127.0.0.1:6379>mget k1 k2 k3
- 取值并赋值
127.0.0.1:6379>getset key value
127.0.0.1:6379>getset k1 111
127.0.0.1:6379>get k1
- 删除
127.0.0.1:6379>del k1
-
数据增减
增incr num 或者 incrby num 1
减decr num 或者decrby num 1
-
向尾部追加值
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键
的值设置为value,即相当于SET key value。返回值是追加后字符串的总长度。
append key value
127.0.0.1:6379>set str hello
127.0.0.1:6379>append str " world!"
# 12
127.0.0.1:6379>get str
# hello world!
- 获取字符串的长度
127.0.0.1:6379>set str hello
127.0.0.1:6379>strlen str
#5
- 应用到自增主键
商品编号、订单号采用string的递增数字特性生成。2024618001
定义商品编号key:productId
127.0.0.1:6379>set productId 2024618001
127.0.0.1:6379>incr productId
#2024618002
Hash类型
假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username,password,age等属性,存储过程如下:
{
id : 1,
username: zhangsan
....
}
set user { Id : 1,username: zhangsan}
保存、更新:
User对象----->json(string) -------> redis
如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢?如果仍然采用上边的方法在传输、处理时会造成资源浪费,下边讲的hash可以很好的解决这个问题。
redis hash介绍
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其他类型。
- 赋值
hset user username zhangsan
多字段赋值hmset user username lisi age 21 gender female city henan
当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作hsetnx key field value
hsetnx user username lisi
- 取值
- 一次只能获取一个字段值
hget user username
- 一次可以获取多个字段值
hmget user username age gender city
- 获取所有字段和字段值
hgetall user
- 删除字段
可以删除一个或多个字段,返回值是被删除的字段个数
语法:HDEL key field [field …]
- 删除一个字段
hdel user username
- 删除多个字段
hdel user age gender city
- 增加数值
hincrby user age 2
# 23
hget user age
#23
-
判断字段是否存在
语法:hexists key field
查看user中是否有age字段hexists user age
查看user中是否有username字段hexists user username
-
只获取字段名或字段值
- 只获取字段名
hkeys user
- 只获取字段值
hvals user
- 获取属性数量
hlen user
- 应用到存储商品信息
- 商品字段
【商品id、商品名称、商品描述、商品库存、商品好评】 - 定义商品信息的key
商品1001的信息在Redis中的key为:[items:1001] - 存储商品信息
hmset wahaha id 001 classname water price 2
- 获取商品信息
hmget wahaha id classname
hgetall wahaha
List类型
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表(double linked list)实现的,所以获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
- 命令
- 向列表左边增加元素
语法:lpush key value
lpush list 1 2 3
- 向列表右边增加元素
语法:rpush key value
rpush list a b c
- 查看列表
LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
lrange key start stop
lrange list 0 5 或者 lrange list 0 -1
- 从列表两端弹出元素
LPOP命令从列表左边弹出一个元素,会分两步完成:
第一步是将列表左边的元素从列表中移除
第二步是返回被移除的元素值。
语法:LPOP key RPOP key
lpop list
#1
rpop list
#c
127.0.0.0:6379> lrange list 0 -1
1) "2"
2) "1"
3) "a"
4) "b"
- 获取列表中元素的个数
llen list
#4
5.获取/设置指定索引的元素值
- 获取指定索引的元素值
lindex list 2
- 设置指定索引的元素值
lset list 2 c
lrange list 0 -1 //查询所有
- 向列表中插入元素
该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
语法:linsert list before|after pivot value
lrange list 0 -1
linsert list after 3 4
- 将元素从一个列表转移到另一个列表中
语法:rpoplpush list newlist
rpoplpush list newlist
lrange list 0 -1
lrange newlist 0 -1
- 应用到商品评价列表
lpush items:comment:1001 '{"id":1,"name":"商品不错,很
好!!","date":1430295077289}'
Set类型
集合中的数据是不重复且没有顺序。
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等
Redis还提供了多个集合之间的交集、并集、差集的运算
- 命令
- 增加/删除元素
sadd key1 1 2 3
sadd key1 4
srem key1 2 3
- 获取集合中的所有元素
smembers key1
- 判断元素是否在集合中
sismember key1 2
- 查看键类型
type key1
- 运算命令
- 集合的差集运算A-B
sadd setA 1 2 3
sadd setB 2 3 4
sdiff setA setB
sdiff setB setA
- 集合的交集运算A∩B
sinter setA setB
- 集合的并集运算A∪B
sunion setA setB
- 其他命令
- 获取集合中元素的个数
smembers setA
scard setA
- 从集合中弹出一个元素
注意:由于集合是无序的,所有 SPOP 命令会从集合中随机选择一个元素弹出
spop setA
SortedSet类型zset
在集合类型的基础上,有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成
插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前 N 个元素、获取指定分数范围内的元素等与分数有关的操作。
在某些方面有序集合和列表类型有些相似。
- 二者都是有序的。
- 二者都可以获得某一范围的元素。
二者也有着很大区别:
- 列表类型是通过链表实现的,获取靠近两端的数据度极快,而当元素增多后,访问中间数据的速度会变慢。
- 有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
- 列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
- 有序集合要比列表类型更耗内存。
命令
- 增加元素
向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素
zadd scoreboard 90 zhangsan 89 lisi 80 zhaoliu
- 获取元素的分数
zscore scoreboard lisi
- 删除元素
zrem scoreboard lisi
- 获得排名在某个范围的元素列表
zrange scoreboard 0 1
zrevrange scoreboard 0 -1
#如果需要获得元素的分数的可以在命令尾部加上*WITHSCORES*参数
zrange scoreboard 0 1 withscores
- 获取指定分数范围的元素
zrangebyscore scoreboard 80 90
# 语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT off set count]
zrangebyscore scoreboard 80 90 limit 1 2
- 增加某个元素的分数
zincrby scoreboard 6 zhangsan
- 获取集合中元素的数量
zcard scoreboard
- 获取指定分数范围内的元素个数
zcount scoreboard 90 100
- 按照排名范围删除元素
zremrangebyrank scoreboard 0 0
- 按照分数范围删除元素
zremrangebyscore scoreboard 90 100 limit 1 2
- 获取元素的排名
zrank scoreboard zhangsan
zrevrank scoreboard zhangsan
- 应用到商品销售排行榜
zadd goods:001 9 1001 10 1002
zincrby good:001 3 1001
zrange goos:001 0 9 withscores