一、数据类型
Redis支持五种数据类型:
string(字符串)
hash(哈希)
list(列表)
set(集合)
zset(sorted set:有序集合)
二、String(字符串)
2.1、简介
- string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
- string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
- string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
- 常用命令:set、get、decr、incr、mget等。
- 注意:一个键最大能存储512MB。
2.2、字符串操作
2.2.1、set
- set存储的数据都是字符类型
192.168.4.51:6351> set a 1
OK
192.168.4.51:6351> get a
"1"
192.168.4.51:6351> type a
string
- 设置key及值
EX表示以秒为单位,PX表示以毫秒为单位。
NX存储变量时,变量不存在则赋值,存在则放弃赋值。
XX存储变量时,默认覆盖。
192.168.4.51:6351> SET key value [EX seconds] [PX milliseconds] [NX|XX]
2.2.2、setrange
用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从指定的偏移量开始。0表示由第一位开始。1表示第二位,以此类推。
192.168.4.51:6351> set b ABCDEFG
OK
192.168.4.51:6351> get b
"ABCDEFG"
192.168.4.51:6351> SETRANGE b 0 abcd
(integer) 7
192.168.4.51:6351> get b
"abcdEFG"
2.2.3、strlen
统计字符串长度
192.168.4.51:6351> set c 12345678
OK
192.168.4.51:6351> STRLEN c
(integer) 8
2.2.4、append
存在则追加,不存在则创建key以及value,返回key长度
192.168.4.51:6351> set d 123
OK
192.168.4.51:6351> get d
"123"
192.168.4.51:6351> APPEND d 123
(integer) 6
192.168.4.51:6351> get d
"123123"
192.168.4.51:6351> APPEND e 123456
(integer) 6
192.168.4.51:6351> get e
"123456"
2.2.5、setbit
- SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。
当 key 不存在时,自动生成一个新的字符串值。
字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。
offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。 - 设置bit的值为a
a的ASCll码是97,转换为二进制位01100001
192.168.4.51:6351> set bit a
OK
192.168.4.51:6351> get bit
"a"
- 把bit的值由a修改为b
b的ASCII码是98,二进制为01100010
就是将 01100001 变成 01100010
192.168.4.51:6351> setbit bit 6 1
(integer) 0
192.168.4.51:6351> setbit bit 7 0
(integer) 1
192.168.4.51:6351> get bit
"b"
2.2.6、bitcount
统计字符串的二级制码中,有多少个’1’
192.168.4.51:6351> bitcount bit
(integer) 3
2.2.7、decr和decrby
- decr
将key中的值减一,key不存在则先初始化为0,再减1
192.168.4.51:6351> set test1 10
OK
192.168.4.51:6351> get test1
"10"
192.168.4.51:6351> decr test1
(integer) 9
192.168.4.51:6351> get test1
"9"
- decrby
decrby key decrment
将key中的值,减去decrment
192.168.4.51:6351> set test2 100
OK
192.168.4.51:6351> DECRBY test2 99
(integer) 1
192.168.4.51:6351> get test2
"1"
2.2.8、getrange
返回字符串中的子字符串,截取范围为start和end
负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符。
192.168.4.51:6351> set test3 abcdefgh
OK
192.168.4.51:6351> GETRANGE test3 -3 -1
"fgh"
192.168.4.51:6351> GETRANGE test3 -6 -2
"cdefg"
2.2.9、incr和incrby
整数计数器
- incr
将key的值加1,如果key不存在,则初始化为0后再加1
主要应用为计数器
192.168.4.51:6351> set level 168
OK
192.168.4.51:6351> INCR level
(integer) 169
192.168.4.51:6351> get level
"169"
- incrby
将key的值增加increment
192.168.4.51:6351> INCRBY level 20
(integer) 189
192.168.4.51:6351> get level
"189"
2.2.10、incrbyfloat
小数计数器
192.168.4.51:6351> INCRBYFLOAT level 11.11
"200.11"
192.168.4.51:6351> get level
"200.11"
2.2.11、mget
获取多个key值,空格分隔,具有原子性
192.168.4.51:6351> mget a b c d e
1) "1"
2) "abcdEFG"
3) "12345678"
4) "123123"
5) "123456"
2.2.12、mset
设置多个key值,空格分隔,具有原子性
192.168.4.51:6351> mset aa 1 bb 2 cc 3 dd 4
OK
192.168.4.51:6351> get aa bb cc dd
(error) ERR wrong number of arguments for 'get' command
192.168.4.51:6351> mget aa bb cc dd
1) "1"
2) "2"
3) "3"
4) "4"
三、Hash(哈希)
3.1、简介
Redis hash 是一个键值(key=>value)对集合;是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
每个 hash 可以存储 232 -1 键值对(40多亿)。
常用命令:hget、hset、hgetall等。
应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。
3.2、操作
3.2.1、hset和hget
插入和输出
192.168.4.51:6351>
192.168.4.51:6351> hset site baidu www.baidu.com
(integer) 1
192.168.4.51:6351> hset site jingdong www.jd.com
(integer) 1
192.168.4.51:6351> type site
hash
192.168.4.51:6351> hget site baidu
"www.baidu.com"
192.168.4.51:6351> hget site jingdong
"www.jd.com"
3.2.2、hmset和hmget
多个表赋值、和输出
192.168.4.51:6351> hmset site1 taobao www.taobao.com google www.google.com
OK
192.168.4.51:6351> hmget site1 taobao google
1) "www.taobao.com"
2) "www.google.com"
3.2.3、hkeys
返回hash表中石油filed名称
192.168.4.51:6351> hkeys site
1) "baidu"
2) "jingdong"
192.168.4.51:6351> hkeys site1
1) "taobao"
2) "google"
3.2.4、hgetall
返回hash表中所有field的值
192.168.4.51:6351> hgetall site
1) "baidu"
2) "www.baidu.com"
3) "jingdong"
4) "www.jd.com"
192.168.4.51:6351> hgetall site1
1) "taobao"
2) "www.taobao.com"
3) "google"
4) "www.google.com"
3.2.5、hvals
返回hash表中所有filed的值
192.168.4.51:6351> hvals site
1) "www.baidu.com"
2) "www.jd.com"
192.168.4.51:6351> hvals site1
1) "www.taobao.com"
2) "www.google.com"
3.2.6、hdel
删除hash表中多个filed的值,不存在则忽略
192.168.4.51:6351> hdel site1 taobao
(integer) 1
192.168.4.51:6351> hgetall site1
1) "google"
2) "www.google.com"
四、List(列表)
4.1、简介
- 一个变量可以存储多个值
- 先进后出
先输入的字符,最后输出
- Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
- list类型经常会被用于消息队列的服务,以完成多程序之间的消息交换。
- 常用命令:lpush、rpush、lpop、rpop、lrange等。
- 列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
4.2、列表操作
4.2.1、lpush
将一个或多个值value插入到列表key的表头
key不存在,则创建key
key存在时,继续插入,不覆盖
192.168.4.51:6351> LPUSH list a b c d e f g
(integer) 7
192.168.4.51:6351> type list
list
4.2.2、lrange
从开始位置读取key值到stop结束
先进后出原则
192.168.4.51:6351> LRANGE list 0 -1 //从开始读到结束
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
4.2.3、lpop
移除并返回列表头元素数据,key不存在则返回nil
192.168.4.51:6351> LPOP list
"4"
192.168.4.51:6351> LPOP list
"3"
192.168.4.51:6351> LRANGE list 0 -1
1) "2"
2) "1"
3) "g"
4) "f"
5) "e"
6) "d"
7) "c"
8) "b"
9) "a"
4.2.4、llen
返回列表key长度
192.168.4.51:6351> LLEN list
(integer) 9
4.2.5、lindex
返回列表中第index个值
192.168.4.51:6351> LINDEX list 2
"g"
192.168.4.51:6351> LINDEX list 5
"d"
4.2.6、lset
将key中的index位置的值修改为value
192.168.4.51:6351> lset list 3 list3
OK
192.168.4.51:6351> LRANGE list 0 -1
1) "2"
2) "1"
3) "g"
4) "list3"
5) "e"
6) "d"
7) "c"
8) "b"
9) "a"
4.2.7、rpush
将value插入到key的末尾
192.168.4.51:6351> LPUSH list2 a b c
(integer) 3
192.168.4.51:6351> RPUSH list2 d
(integer) 4
192.168.4.51:6351> LRANGE list2 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
4.2.8、rpop
删除并返回key末尾的值
192.168.4.51:6351> rpop list2
"d"
五、Set(集合)
Redis的Set是string类型的无序集合。和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
应用场景:
- 利用交集求共同好友。
- 利用唯一性,可以统计访问网站的所有独立IP。
- 好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。
常用命令:sadd、spop、smembers、sunion等。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
sorted set是插入有序的,即自动排序。
常用命令:zadd、zrange、zrem、zcard等。
当你需要一个有序的并且不重复的集合列表时,那么可以选择sorted set数据结构。
应用举例:
(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。
(2)排行榜应用,根据得分列出topN的用户等。