Redis简介
Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis与其他key-value缓存有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis优势
- 性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s。
- 丰富的数据类型:Redis支持二进制案例的Strings, Lists, Hashes, Sets 及Ordered Sets数据类型操作。
- 原子:Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性:Redis还支持publish/subscribe, 通知, key过期等等特性。
Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
-
string(字符串)
string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的。即redis的string可以包含任何数据。比如jpg图片或者序列化的对象。string类型是Redis最基本的数据类型,一个键最大能存储512MB。 -
hash(哈希)
Redis hash是一个键名对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 - list(列表)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 - set(集合)
Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 - zset(sorted set:有序集合)
Redis zset 和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
Redis命令
启动客户端命令
使用redis-server命令启动redis客户端,打开终端并输入命令redis-cli。该命令会连接本地的redis服务。
- $redis-cli
- redis 127.0.0.1:6379>
- redis 127.0.0.1:6379> PING
- PONG
连接到本地的redis服务并执行PING命令,该命令用于检测redis服务是否启动。
如果需要在远程redis服务上执行命令,同样我们使用的也是redis-cli命令。
- redis-cli -h host -p port -a password
实例:
连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上
- $redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
- redis 127.0.0.1:6379>
- redis 127.0.0.1:6379> PING
- PONG
Redis keys命令
Redis DEL命令
Redis DEL命令用于删除已存在的键。不存在的key会被忽略。
- redis 127.0.0.1:6379> DEL KEY_NAME
返回值:被删除 key 的数量
实例:
- redis 127.0.0.1:6379> SET w3ckey redis
- OK
- redis 127.0.0.1:6379> DEL w3ckey
- (integer) 1
Redis EXISTS命令
Redis EXISTS命令用于检查给定key是否存在。
- redis 127.0.0.1:6379> EXISTS KEY_NAME
返回值:若key存在返回1 ,否则返回0。
实例:
- redis 127.0.0.1:6379> EXISTS runoob-new-key
- (integer) 0
- redis 127.0.0.1:6379> set runoob-new-key newkey
- OK
- redis 127.0.0.1:6379> EXISTS runoob-new-key
- (integer) 1
Redis Expire命令
Redis Expire命令用于设置key的过期时间。key过期后将不再可用。
- redis 127.0.0.1:6379> Expire KEY_NAME TIME_IN_SECONDS
返回值:设置成功返回1 。 当key不存在或者不能为key设置过期时间时(比如在低于2.1.3 版本的Redis 中你尝试更新key的过期时间)返回 0 。
实例:
- redis 127.0.0.1:6379> SET runooobkey redis
- OK
- redis 127.0.0.1:6379> EXPIRE runooobkey 60
- (integer) 1
我们为键runooobkey设置了过期时间为1分钟,1分钟后该键会自动删除。
Redis Move命令
Redis MOVE命令用于将当前数据库的key移动到给定的数据库db当中。
- redis 127.0.0.1:6379> MOVE KEY_NAME DESTINATION_DATABASE
返回值:移动成功返回1 ,失败则返回0 。
实例:
- # key 存在于当前数据库
- redis> SELECT 0 # redis默认使用数据库 0,为了清晰起见,这里再显式指定一次。
- OK
- redis> SET song "secret base - Zone"
- OK
- redis> MOVE song 1 # 将 song 移动到数据库 1
- (integer) 1
- redis> EXISTS song # song 已经被移走
- (integer) 0
- redis> SELECT 1 # 使用数据库 1
- OK
- redis:1> EXISTS song # 证实 song 被移到了数据库 1 (注意命令提示符变成了"redis:1",表明正在使用数据库 1)
- (integer) 1
- # 当 key 不存在的时候
- redis:1> EXISTS fake_key
- (integer) 0
- redis:1> MOVE fake_key 0 # 试图从数据库 1 移动一个不存在的 key 到数据库 0,失败
- (integer) 0
- redis:1> select 0 # 使用数据库0
- OK
- redis> EXISTS fake_key # 证实 fake_key 不存在
- (integer) 0
- # 当源数据库和目标数据库有相同的 key 时
- redis> SELECT 0 # 使用数据库0
- OK
- redis> SET favorite_fruit "banana"
- OK
- redis> SELECT 1 # 使用数据库1
- OK
- redis:1> SET favorite_fruit "apple"
- OK
- redis:1> SELECT 0 # 使用数据库0,并试图将 favorite_fruit 移动到数据库 1
- OK
- redis> MOVE favorite_fruit 1 # 因为两个数据库有相同的 key,MOVE 失败
- (integer) 0
- redis> GET favorite_fruit # 数据库 0 的 favorite_fruit 没变
- "banana"
- redis> SELECT 1
- OK
- redis:1> GET favorite_fruit # 数据库 1 的 favorite_fruit 也是
- "apple"
Redis TTL命令
Redis TTL命令以秒为单位返回key的剩余过期时间。
- redis 127.0.0.1:6379> TTL KEY_NAME
返回值:当key不存在时,返回-2 。 当key存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key 的剩余生存时间。
注意:在 Redis2.8以前,当key不存在,或者key没有设置剩余生存时间时,命令都返回-1 。
实例:
- # 不存在的 key
- redis> FLUSHDB
- OK
- redis> TTL key
- (integer) -2
- # key 存在,但没有设置剩余生存时间
- redis> SET key value
- OK
- redis> TTL key
- (integer) -1
- # 有剩余生存时间的 key
- redis> EXPIRE key 10086
- (integer) 1
- redis> TTL key
- (integer) 10084
Redis Type命令
Redis Type命令用于返回key所储存的值的类型。
- redis 127.0.0.1:6379> TYPE KEY_NAME
返回值:返回key的数据类型,数据类型有:
none (key不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
实例:
- # 字符串
- redis> SET weather "sunny"
- OK
- redis> TYPE weather
- string
- # 列表
- redis> LPUSH book_list "programming in scala"
- (integer) 1
- redis> TYPE book_list
- list
- # 集合
- redis> SADD pat "dog"
- (integer) 1
- redis> TYPE pat
- set