Redis是一个高性能的键值对非关系型数据库
Redis的特点优势:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
Redis数据类型
- Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
1.字符串String
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
字符串相关命令
- set key value
- get key
- getrange key start end 返回 key 中字符串值的子字符
- getset key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
- mget key key2 获取一个或多个key的值
- strlen key 返回key所存储的字符串的长度
> set str qwertyuiop
OK
> getrange str 0 4 #返回值中子字符串
"qwert"
-------------------------------------------------------------
> set str qq
OK
> get str
"qq"
> getset str qwer #将给定 key 的值设为 value ,并返回 key 的旧值
"qq"
-------------------------------------------------------------
> mget key1 key2 key3 #获取多个key的值
1) "mysql"
2) "mongodb"
3) "redis"
2.哈希Hash
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
> hmset xiaoming name xiaoming age 20 id 1510252 phone 18234682578
OK
> hgetall xiaoming
1) "name"
2) "xiaoming"
3) "age"
4) "20"
5) "id"
6) "1510252"
7) "phone"
8) "18234682578"
> hget xiaoming phone
"18234682578"
命令
- hdel key field1 field2 删除一个或多个哈希字段
- hexists key field 查找指定字段是否存在
- hget key field,hgetall key 获取一个或所有字段
- hkeys key 获取所有哈希表中的字段
- hlen key 获取哈希表中字段的数量
- hmget ;hmset 获取设置多个字段的值
> hkeys xiaoming #获取所有哈希表中的字段
1) "name"
2) "age"
3) "id"
4) "phone"
> hlen xiaoming #获取所有哈希表中字段的数量
4
3.列表List
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
命令
- lindex key index 根据索引获取列表中的元素
- llen key 返回列表长度
- lpop key 移出并获取列表的第一个元素
- rpop key 移除并获取列表的最后一个元素
- lpush key v1 v2 将一个或多个值插入到列表头部
- lrange key strart end 获取索引从start到end的值
- lrem key count value 移除列表元素
> lpush blog q1 q2 q3 q4 q5 #插入多个数据
(integer) 5
> lrange blog 0 4 #类似于python中的切片
1) "q5"
2) "q4"
3) "q3" #可以看到,插入时是往头部插入,先插入的在最后面,后插入的在最前面
4) "q2"
5) "q1"
> llen blog #返回列表长度
(integer) 5
> lindex blog 1 #根据索引获取元素值
"q4"
> lpop blog #从左侧也就是开始位置移除并获取元素
"q5"
> rpop blog #从右侧也就是最后面
"q1"
> lrange blog 0 10
1) "q4"
2) "q3"
3) "q2"
4.集合Set
Redis的Set是string类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
命令
- sadd key m1 m2 m3 添加一个或多个元素到集合
- scard key 获取集合中元素个数
- smembers key 获取所有集合成员
- sismember key member 判断member是否是该集合成员
- spop key 移除并返回集合中一个随机元素
- srem key m1 m2 删除集合中一个或多个元素
> sadd qq redis
(integer) 1
> sadd qq mongodb
(integer) 1
> sismember qq mysql #判断是否是成员
(integer) 0
> smembers qq #列出所有成员
1) "mongodb"
2) "redis"
> scard qq #获取集合中元素个数
2
> spop qq
"redis"
> srem qq mongodb
1
> smembers qq
(empty list or set)
5.有序集合 zset(sorted set)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
> zadd er 3.0 qq
(integer) 1
> zadd er 99.0 haha
(integer) 1
> zadd er 1.0 python
(integer) 1
> zadd er 66 redis
(integer) 1
> zrangebyscore er 0 100
1) "python"
2) "qq"
3) "redis"
4) "haha"
命令
- zadd key score m1 score m2 添加一个或多个元素
- zcard key 获取成员个数
- zcount key min max 获取分数在minmax之间的个数
- zrange key start stop 获取分数在之间的元素
- zrem key m1 m2 删除一个或多个元素
- zscore key member 返回元素的分数值
Redis命令
$ redis-cli #进入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
关于键的命令
1 DEL key
该命令用于在 key 存在时删除 key。
2 DUMP key
序列化给定 key ,并返回被序列化的值。
3 EXISTS key
检查给定 key 是否存在。
8 KEYS pattern
查找所有符合给定模式( pattern)的 key 。
9 MOVE key db
将当前数据库的 key 移动到给定的数据库 db 当中。
13 RANDOMKEY
从当前数据库中随机返回一个 key 。
14 RENAME key newkey
修改 key 的名称
15 RENAMENX key newkey
仅当 newkey 不存在时,将 key 改名为 newkey 。
16 TYPE key
返回 key 所储存的值的类型。
#设置一个键,重命名,判断原来名字的键是否存在,判断改名后的是否存在,给出值的类型,删除该键
> set python redis
OK
> rename python db
OK
> exists python
(integer) 0
> exists db
(integer) 1
> type db
"string"
> del db
(integer) 1
---------------------------------------------------------------------------------
#生成一个键值对,值为列表
> lpush qq 1
(integer) 1
> lpush qq haha
(integer) 2
> lpush qq redis
(integer) 3
> type qq
"list"