在各大公司的招聘中,经常在工作职责里看到要求熟悉Redis,为了更好的发展只能催促自己趁着有空学习和记录一下了。
一、简介
Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库,全名叫RemoteDictionaryServer,使用C语言编写,是key-value存储系统,支持丰富的数据类型。
二、应用场景
Redis交换数据快,常用来存储频繁被调用的数据,这样就节省了系统在磁盘上获取数据的IO开销,极大提升速度。
一个redis实例最多可以提供16个数据库,下标是从0到15,默认连接的是第0号数据库
三、安装Redis
下载链接:Redis-x64-5.0.10.msi(提取码:0cel)
傻瓜式一键安装即可
设定目录:
服务端口
四、可视化工具
虽然可以通过命令行来进行查看数据,但是不够直观,用上可视化工具可以大大提高效率。
我目前用的是redis desktop manager(提取码:4upe),也是一键式傻瓜安装
设置相应ip和端口即可连接
查看以及操作数据
五、数据类型
Redis有着String、Hash、List、Set、Sorted Set等五个基本数据类型。
3.1 String
String类型在redis中是最常见的类型,value存储最大数据量为512M。
下面为String的常见操作命令(键值为key)
命令 | 描述 |
---|---|
set key value | 设置key的值 |
get key | 获取key的值 |
getrange key start end | 截取子字符串(类似于java中的substring,start为起始索引,end为结束索引) |
mset key1[key2] | 同时设置多个字符串 |
mget key1 [key2] | 同时读取多个字符串 |
setex key seconds value | 给字符串设置值,同时限定有效期seconds(单位:秒) |
setnx key value | 当值为空时,赋值 |
setrange key offset value | 根据偏移量offset赋值value给key |
strlen | 获取字符串长度 |
incr key | 对字符串存储的数字值+1 |
incrby key increment | 对字符串存储的数字值增加指定的值increment |
incrbyfloat key increment | 对字符串存储的数字值增加指定的浮点值increment |
decr key | 对字符串存储的数字值-1 |
decrby key increment | 对字符串存储的数字值减去指定的值increment |
append key value | 拼接值 |
del key | 删除字符串 |
示例:
127.0.0.1:6379> set word "a1" //设置String值
OK
127.0.0.1:6379> get word //获取字符串值
"a1"
3.2 hash
一个String类型的field(字段)和value(值)的映射表,适合用来存放对象。
命令 | 描述 |
---|---|
hmset key field value[field value…] | 创建hash表,赋值字段和值 |
hmget key field [field…] | 获取hash表字段值 |
hgetall key | 获取hash表所有的字段和值 |
hkeys key | 获取所有字段 |
hlen key | 获取字段数量 |
hexists key field | 判断指定字段是否存在 |
hset key field value | 设置表字段值 |
hsetnx key field value | 只有字段field不存在时,设置字段的值 |
示例:
127.0.0.1:6379> hmset student:001 id 001 name tom age 18
OK
127.0.0.1:6379> hget student:001 name
"tom"
127.0.0.1:6379> hgetall student:001
1) "id"
2) "001"
3) "name"
4) "tom"
5) "age"
6) "18"
127.0.0.1:6379> hkeys student:001
1) "id"
2) "name"
3) "age"
127.0.0.1:6379> hlen student:001
(integer) 3
127.0.0.1:6379> hexists student:001 name
(integer) 1
127.0.0.1:6379> hexists student:001 sex
(integer) 0
127.0.0.1:6379> hset student:001 sex 1
(integer) 1
127.0.0.1:6379> hget stundet:001 sex
(nil)
127.0.0.1:6379> hget student:001 sex
"1"
127.0.0.1:6379> hsetnx student:001 sex 2
(integer) 0
127.0.0.1:6379> hget student:001 sex
"1"
3.3 list
翻译成列表,类似于LinkedList。
命令 | 描述 |
---|---|
lpush key value1[value2 …] | 将一个或多个值插入到列表头部 |
rpush key value1[value2 …] | 将一个或多个值插入到列表尾部 |
lindex key index | 通过索引获取列表中的元素 |
llen key | 获取列表长度 |
lpushx key value | 将一个值插入到已存在的列表头部 |
lrange key start end | 获取列表指定范围内的元素 |
lset key index value | 通过索引设置元素 |
del key | 删除list |
示例:
127.0.0.1:6379> lpush mylist MongoDB //头部插入元素
(integer) 1
127.0.0.1:6379> lpush mylist mysql //头部插入元素
(integer) 2
127.0.0.1:6379> rpush mylist redis //尾部插入元素
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1 //展示0到尾部所有元素
1) "mysql"
2) "MongoDB"
3) "redis"
127.0.0.1:6379> lindex mylist 1 //获取指定索引元素
"MongoDB"
3.4 Set(集合)
类似于Java中的set集合,是一种无序的集合,其中的元素没有先后顺序。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
命令 | 描述 |
---|---|
sadd key member1 [member2…] | 对集合添加一个或多个成员 |
scard key | 获取集合的成员数 |
smembers key | 获取集合中的成员 |
sismember key member | 判断集合是否包含指定成员 |
sinter key1 [key2…] | 获取多个集合的交集 |
sdiff key1 [key2…] | 返回第一个集合与其他集合之间的差异 |
sunion key1 [key2…] | 获取多个集合并集 |
示例:
127.0.0.1:6379> sadd testSet redis
(integer) 1
127.0.0.1:6379> sadd testSet oracle
(integer) 1
127.0.0.1:6379> sadd testSet mysql
(integer) 1
127.0.0.1:6379> scard testSet
(integer) 3
127.0.0.1:6379> smembers testSet
1) "redis"
2) "mysql"
3) "oracle"
127.0.0.1:6379> sismember testSet mysql
(integer) 1
127.0.0.1:6379> sadd mytest a java oracle redis
(integer) 4
//对两个集合求交集
127.0.0.1:6379> sinter mytest testSet
1) "redis"
2) "oracle"
127.0.0.1:6379> sdiff testSet mytest
1) "mysql"
//对两个集合求并集
127.0.0.1:6379> sunion testSet mytest
1) "redis"
2) "oracle"
3) "mysql"
4) "java"
5) "a"
3.5 sorted Set(有序集合)
和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
命令 | 描述 |
---|---|
zadd key score1 member1 [score2 member2 …] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
zcard key | 获取有序集合的成员数 |
zrank key member | 获取元素对应的索引 |
zrange key start end | 获取有序集合指定范围的元素 |
zrem key member1 [member2 …] | 移除集合中的一个元素或多个元素 |
示例:
127.0.0.1:6379> zadd myset 1 sad 2 angry
(integer) 2
127.0.0.1:6379> zadd myset 2 mysql
(integer) 1
127.0.0.1:6379> zcard myset
(integer) 3
127.0.0.1:6379> zadd key 3 mysql
(integer) 1
127.0.0.1:6379> zcard myset
(integer) 3
127.0.0.1:6379> zrank myset mysql
(integer) 2
127.0.0.1:6379> zrank myset angry
(integer) 1
127.0.0.1:6379> zrank myset sad
(integer) 0
127.0.0.1:6379> zrange myset 1 -1
1) "angry"
2) "mysql"
127.0.0.1:6379> zrem myset sad
(integer) 1
127.0.0.1:6379> zrange myset 0 -1
1) "angry"
2) "mysql"
127.0.0.1:6379> zscore myset mysql
"2"