介绍
Redis是REmote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。Redis字典中的键值除了可以是字符串,还可以是其他数据类型。到目前为止Redis支持的键值数据类型如下:
- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
Redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势。但是基于持久化这个问题,Redis可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务。
安装
redis官网
从网站获取安装包,解压然后进行安装以Linux环境为例:
1. wget http://download.redis.io/releases/redis-6.0.10.tar.gz
2. tar -zvxf redis-6.0.10.tar.gz
3. mv /root/redis-6.0.10 /usr/local/redis
然后在/usr/local/redis目录下执行:
4. make
安装:
5. make PREFIX=/usr/local/redis install
使redis服务端以后台进程方式启动,更改其配置文件设置daemonize属性为yes:
6. vim /usr/local/redis/redis.conf
在/usr/local/redis目录下启动服务端:
7. ./bin/redis-server ./redis.conf
还可以把redis的配置文件和二进制文件命令分别放置到指定文件夹,进行配置,设置开机启动之类的操作就不细细列出了。
使用
启动客户端 ./redis-cli
PING命令测试客户端与redis连接是否正常:
redis 127.0.0.1:6379>PING
PONG
redis 127.0.0.1:6379>ECHO hi
"hi"
Redis的5种数据类型
字符串类型
字符串类型是Redis中的最基础的数据类型,它能存储任何形式的字符串,包括二进制数据。一个字符串类型键允许存储的数据的最大容量是512MB。
SET key value
GET key
MSET key value [key value...]
MGET key [key...]
字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同。例如,列表类型是以列表的形式组织字符串,而集合类型是以集合的形式组织字符串。
散列类型
散列类型的键值也是一种字典结构,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型。一个散列类型键可以包含至多232-1个字段。
HSET key field value
HGET key field
HMSET key field value[field value...]
HMGET key field [field...]
散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。
列表类型
列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
LPUSH key value [value ...]
RPUSH key value [value ...]
列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。与散列类型最多能容纳的字段数量相同,一个列表类型键最多能容纳232-1个元素。
集合类型
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在Redis内部是使用值为空的散列表实现的,所以这些操作的复杂度都是O(1)。最方便的是多个集合类型键之间还可以进行并集、交集和差集运算。
SADD key member [member ...]
SREM key member [member ...]
SMEMBERS key //返回集合中所有元素
SISMEMBER key member //判断元素是否在集合中
SDIFF key [key ...] //对多个集合执行差集运算
SINTER key [key ...] //对多个集合执行交集运算
SUNION key [key ...] //对多个集合执行并集运算
集合类型跟列表类型有很多相似之处但是其唯一性可以区别开,集合类型是具有唯一性的而列表类型不具备。
有序集合类型
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是它们的分数却可以相同。
ZADD key score member [score member ...]
ZSCORE key member
ZRANGE key start stop [WITHSCORES]
ZERVRANGE key start stop [WITHSCORES]
有序集合与列表类型有些相似:
- 二者都i是有序的。
- 二者都可以获得某一范围的元素。
二者也有很大的区别: - 列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜感”或“日志”这样很少访问中间元素的应用。
- 有序集合类型是使用散列表和跳跃表实现的,所以即使读取位于中间部分的数据速度也很快。(时间复杂度为O(log(N)))。
- 列表中不能简单地调整某个元素的位置,但是有序集合可以。
- 有序集合比列表类型更耗费内存。
事务
Redis中的事务是一组命令的集合。事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
redis> MULTI
ok
redis> SADD 'user : 1 : following' 2
QUEUED
redis> SADD 'user : 2 : followers' 1
QUEUED
redis> EXEC
1) (integer)1
2) (integer)1
事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。
WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令。
EXPIPE命令的使用方法为EXPIPE key seconds,其中seconds参数表示键的过期时间,单位是秒。如要想让session : 29e3d键在15分钟后被删除:
redis> EXPIPE session : 29e3d 900
(integer) 1
TTL命令是一个键还有多久时间会被删除。返回值是键的剩余时间(单位是秒)。