Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种数据类型,功能挺强。
1. 什么是Redis
简而言之,Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种数据类型,功能挺强。
2. Redis有什么优势
- 速度快:Redis使用内存来存储数据集,且支持Pipelining命令,可以一次发送多条命令。
- 持久化:可以把内存中的数据保存在磁盘中,在重启时可重新加载使用。
- 原子性:所有操作都是原子性的,同时支持事务。
- 数据结构丰富:支持字符串、列表、哈希、集合及有序集合,满足大多数使用需求。
- 支持多种语言:Redis支持许多语言,如C、C++、C#、Go、Java、JavaScript、PHP等等。
- 多种特性:Redis还支持publish/subscribe, 通知, key 过期等特性。
3. Redis能做什么
因为Redis交换数据速度快,所以常在服务器中被用于存储一些需要频繁调取的数据,相比于直接读取磁盘来获得数据,使用Redis可以节省大量时间,提升效率。举个例子:
某视频网站每天有100万人访问首页推荐视频专栏,如果都从数据库查询读取,那么每天都至少要多出100万次数据库查询请求。若使用了Redis,将常被调取的数据存到内存中,每次节约0.1秒,100万次就有10万秒,极大程度提高了速度与开销。
总之,Redis的应用场景十分广泛,且价值极高,现在就开始学学基础。
4. 还没安装Redis的同学,可以私信我
5. Redis数据结构
Redis支持五种数据结构:String(字符串)、Hash(哈希)、List(列表)、Set(集合)以及SortedSet(有序集合)。下面我们简单介绍下每一种数据结构以及他们的基本命令。
- StringString是Redis最基本的数据结构,也是任何存储系统都必备的数据类型。String类型是二进制安全的,简单来说,基本上你什么都能用字符串存储,你可以把图片文件的内容或者序列化的对象作为字符串来存储。String类型的值最大可以存512MB,确实基本什么都够存了。
> set mykey "hello world" OK
> gey mykey "hello world"
> getset database "mysql"
(nil)
> get database
"mysql"
> getset database "redis"
"mysql"
> get database
"redis"
Tips:从上面几个实例,我们不难看出字符串起始从0开始;若end大于字符串长度时返回完整字符串;而当end为-1时,end为字符串最后一个字符。
> getrange mykey 6 10
"world"
> getrange mykey 0 20
"hello world"
> getrange mykey 0 -1
"hello world"
Tips: 当键未设置时,会返回(nil)。
> strlen mykey
(integer) 11
> append mykey ", hello redis"
24
>get mykey
"hello world, hello redis"
> set incr_num 10
OK
>get incr_num
"10"
>incr incr_num
(integer) 11
> incrby incr_num 4
(intrger) 15
> incrbyfloat incr_num 0.5
15.5
Tips:整数值会显示为integer,当变为浮点型后并不会提示为float
> set decr_num 10
OK
> get decr_num
"10"
> decr decr_num
(integer) 9
> decrby decr_num 4 (integer) 5
Tips:redis并没有数字值减少给定浮点值的命令,如果我们想要decr_num减少2.5,可以用incrbyfloat命令执行incrbyfloat decr_num -2.5。
> incrbyfloat decr_num -2.5 2.5
- decrby key decrement:整数值减少给定整数值(decrement)
- decr key:整数值-1
- incrbyfloat key increment:数字值增加给定浮点值(increment)
- incrby key increment:整数值增加给定整数值(increment)
- ncr key:整数值+1
- append key value:如果可以已存在且是一个字符串,则将指定value添加到原值末尾,会返回操作后字符串长度
- strlen key:返回键所存储的字符串值的长度
- getset key value:设置指定键的新值,并返回旧值
- getrange key start end:返回key中字符串的子串
- get key:获取指定键的值
- set key value:设置指定键的值
2. HashHash存储的是field和value的映射关系,适合用户存储对象。比如要存储一个用户的姓名、年龄、地址等,就可以使用Hash。每个Hash可以存储232>-1个field-value对(4294967295,40多亿)。
> hset myhash name "test"
(integer) 1
> hget myhash name
"NPC"
> hset myhash name "NPC"
(integer) 0
Tips:使用hset命令,新建字段并设置值成功后返回1,如果修改已有字段的值则返回0。
> hmset myhash age "20" country "China"
OK
> hexists myhash name
(integer) 1
> hexists myhash phone
(integer) 0
Tips:哈希表key中含有字段field返回1,不含有或对应key不存在返回0。
> hmget myhash name age phone
1) "NPC"
2) "20"
3) (nil)
> hgetall myhash
1) "name"
2) "NPC"
3) "age"
4) "20"
5) "country"
6) "China"
> hkeys myhash
1) "name"
2) "age"
3) "country"
> hvals myhash
1) "NPC"
2) "20"
3) "China"
> hlen myhash
3
> hdel myhash age
(integer) 1
- hdel key field1:删除哈希表key中一个field
- hlen key:获取哈希表key中字段的数量
- hvals key:获取哈希表key中所有value
- hkeys key:获取哈希表key中所有field
- hgetall key:获取哈希表key中所有field-value对
- hmget key field1 [field2]:获取哈希表key中所有给定field的value
- hexists key field:查看field是否存在于哈希表key中
- hmset key field1 value1 [field2 value2]:同时设置哈希表key中的多个field-value对。
- hset key field value:设置哈希表中key中field的值为value
- hget key field:获取哈希表key中field对应的value
3. ListRedis的List类型是简单的字符串列表,在底层实现上相当于一个链表,我们可以在列表的头部(左边)或尾部(右边)添加值。列表最多可以存储232>-1个元素(4294967295,40多亿)。
> lpush mylist "a" "b"
(integer) 2
> rpush mylist "c" "d"
(integer) 4
Tips:执行lpush和rpush命令后返回列表的长度。
> llen mylist
(integer) 4
> lrange mylist 0 -1
1) "b"
2) "a"
3) "c"
4) "d"
> lrange mylist 1 -2
1) "a"
2) "c"
Tips:由上述例子我们不难看出lrange命令中的start和end参数都是索引值,其中0代表第一个元素,-1表示最后一个元素。
> lindex mylist 0 "b"
> lpop mylist "b" > rpop mylist "d"
> rpush rem "hello" "hello" "redis" "hello" (integer) 4 > lrange rem 0 -1 1) "hello" 2) "hello" 3) "redis" 4) "hello" > lrem rem -2 "hello" (integer) 2 >lrange rem 0 -1 1) "hello" 2) "redis"
count>0:从左往右搜索列表,移除与value相等的元素,数量为count。count<0:从右往左搜索列表,移除与value相等的元素,数量为count的绝对值。count=0:移除列表中所有与value相等的元素。
- lrem key count value:根据count的值,移除列表中与参数value相等的元素
- lpop key:移除并获取列表头部的值
- rpop key:移除并获取列表尾部的值
- lindex key index:通过索引获取列表中元素
- lrange key start end:获取列表指定范围内的值
- llen key:获取列表长度
- lpush key value1 [value2]:将一个或多个值插入到列表头部(左边)
- rpush key value1 [value2]:将一个或多个值插入到列表尾部(右边)
4. SetSet(集合)存储string类型的值,集合不允许重复元素,但集合里面的元素没有先后顺序。集合中最大的成员数为232>-1(4294967295,40多亿)。
> sadd myset1 "hello" "redis"
(integer) 2
> sadd myset1 "hello"
(integer) 0
Tips:当向集合添加重复成员时,返回0
> scard myset1
2
> smembers myset1
1) "hello"
2) "redis"
> sadd myset2 "hello" "world"
(integer) 2
> sdiff myset1 myset2
1) "redis"
> sdiff myset2 myset1
1) "world"
> sinter myset1 myset2
1) "hello"
> sunion myset1 myset2
1) "hello"
2) "redis"
3) "world"
> sadd myset1 "NPC"
(integer) 1
>spop myset1
"redis"
>smembers myset1
1) "NPC"
2) "hello"
- spop key:移除并返回集合中的一个随机元素
- sunion key1 [key2]:返回所有给定集合的并集
- sinter key1 [key2]:返回所有给定集合的交集
- sdiff key1 [key2]:返回所有给定集合的差集
- smembers key:返回集合中的所有成员
- scard key:获取集合成员数量
- sadd key member1 [member2]:向集合添加一个或多个成员
5. SortedSet除了无序集合(Set),Redis还提供了有序集合(SortedSet),有序集合不允许重复的成员,且每个不同的成员都关联一个double类型的分数,redis通过这些分数对成员进行从小到大排序。有序集合有时也被称为ZSet,因为其命令都是以字母Z开头的。
> zadd myzset 10 "one" 20 "two" 30 "three"
(integer) 3
> zcard myzset
3
> zscore myzset "one"
10.0
> zrange myzset 0 -1
1) "one"
2) "two"
3) "three"
> zrange myzset 0 -1 withscores
1) "one"
2) 10.0
3) "two"
4) 20.0
5) "three"
6) 30.0
> zrevrange myzset 0 -1 withscores
1) "three"
2) 30.0
3) "two"
4) 20.0
5) "one"
6) 10.0
> zrank myzset "one"
0
>zrank myzset "three"
2
> zrevrank myzset "one"
2
> zrevrank myzset "three"
0
> zcount myzset 15 40
2
> zrange myzset 0 -1 withscores
1) "one"
2) 10.0
3) "two"
4) 20.0
5) "three"
6) 30.0
> zincrby myzset 40 "one"
50.0
> zrange myzset 0 -1 withscores
1) "two"
2) 20.0
3) "three"
4) 30.0
5) "one"
6) 50.0
- zincrby key increment member:将指定成员的分数增加increment
- zcount key min max:返回分数在min和max之间的成员数量
- zrank key member:返回指定成员的排名,从小到大排序
- zrevrank key member:返回指定成员的排名,从大到小排序
- zrange key start end [withscores]:通过索引start和end从小到大返回成员
- zrevrange key start end [withscores]:通过索引start和end从大到小返回成员
- zscore key member:返回指定成员的分数
- zcard key:获取有序集合的成员数量
- zadd key score1 member1 [score2 member2]:向有序集合中添加一个或多个成员,或者更新已有成员分数
以上有不足的地方可以指出讨论,觉得不错的朋友希望能得到您的转发支持,同时可以持续关注我,每天分享Linux C/C++后台开发干货内容!