Redis简介
Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings),散列(hashes), 列表(lists),集合(sets),有序集合(sorted sets) 与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。 Redis 内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
Redis命令参考文档网址:http://redisdoc.com
应用场景
1)缓存
使用Redis可以建立性能非常出色的缓存服务器,查询请求先在Redis中查找所需要的数据,如果能够查询到(命中)则直接返回,大大减轻关系型数据库的压力。
2)数据临时存储位置
使用token(令牌)作为用户登录系统时的身份标识,这个token就可以在Redis中临时存储。
3)分布式环境下解决Session不一致问题时的Session库
Spring提供了一种技术解决分布式环境下Session不一致问题,叫SpringSession。而Redis就可以为SpringSession提供一个数据存储空间。
4)流式数据去重
在Redis中有一种数据类型是Set,和Java中的Set集合很像,不允许存储重复数据。借助这个特性我们可以在Redis中使用Set类型存储流式数据达到去重的目的。
Redis安装
上传并解压
1)将redis-4.0.2.tar.gz上传至Linux并解压
[atguigu@hadoop102 software]$ tar -zxvf redis-4.0.2.tar.gz -C /opt/module/
安装C语言编译环境
[atguigu@hadoop102 software]$ sudo yum install -y gcc-c++
修改安装位置
进入Redis的解压目录
[atguigu@hadoop102 software]$ cd ../module/redis-4.0.2/
[atguigu@hadoop102 redis-4.0.2]$ vim src/Makefile
修改
PREFIX?=/opt/module/redis
编译安装
1)编译
[atguigu@hadoop102 redis-4.0.2]$ make
... ...
... ...
LINK redis-server
INSTALL redis-sentinel
CC redis-cli.o
LINK redis-cli
CC redis-benchmark.o
LINK redis-benchmark
INSTALL redis-check-rdb
INSTALL redis-check-aof
Hint: It's a good idea to run 'make test' ;)
make[1]: 离开目录“/opt/module/redis-4.0.2/src”
2)安装
[atguigu@hadoop102 redis-4.0.2]$ make install
cd src && make install
make[1]: 进入目录“/opt/module/redis-4.0.2/src”
CC Makefile.dep
make[1]: 离开目录“/opt/module/redis-4.0.2/src”
make[1]: 进入目录“/opt/module/redis-4.0.2/src”
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: 离开目录“/opt/module/redis-4.0.2/src”
启动Redis服务器
###默认配置启动
[atguigu@hadoop102 redis-4.0.2]$ cd ../redis
[atguigu@hadoop102 redis]$ ll
总用量 4
drwxrwxr-x. 2 atguigu atguigu 4096 6月 17 14:14 bin
[atguigu@hadoop102 redis]$ bin/redis-server
定制配置启动
1)拷贝配置文件到当前目录
[atguigu@hadoop102 redis]$ cp /opt/module/redis-4.0.2/redis.conf ./
2)修改配置文件
[atguigu@hadoop102 redis]$ vim redis.conf
daemonize yes #后台启动
logfile /opt/module/redis/redis.log
dir /opt/module/redis
3)启动Redis
[atguigu@hadoop102 redis]$ bin/redis-server ./redis.conf
客户端登录
1)启动客户端
[atguigu@hadoop102 redis]$ bin/redis-cli
127.0.0.1:6379>
2)测试
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
Redis五种常用数据结构
总体结构
Redis中的数据,总体上是键值对,不同数据类型指的是键值对中值的类型。
KEY | VALUE |
---|---|
KEY | string |
KEY | list |
KEY | set |
KEY | hash |
KEY | zset |
String类型
Redis中最基本的类型,它是key对应的一个单一值
。二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以包含任何数据,比如jpg图片或者序列化的对象。Redis中一个字符串值的最大容量是512M。
List类型
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。说明它的底层是基于链表
实现的,所以它操作时头尾效率高,中间效率低。
Set类型
Redis的Set是String类型的无序集合。它是基于哈希表实现的。
Hash类型
本身就是一个键值对集合。可以当做Java中的Map<String,String>对待。
ZSet类型
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
Redis命令行操作
基本操作
1)切换数据库
Redis默认有16个数据库。
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
可以使用select进行切换,数据库索引从0开始
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379>
2)查看数据库长度
数据库长度指的是当前数据库里面存放了多少的Key。
127.0.0.1:6379> dbsize
(integer) 3
Key操作
1)查找符合格式的Key
EYS PATTERN
*代替多个字符,?代替一个字符
127.0.0.1:6379> KEYS *
127.0.0.1:6379> KEYS ?
2)返回KEY对应的值的类型
TYPE KEY
3)把一组键值对数据移动到另一个数据库中
MOVE KEY DB
4)根据KEY进行删除,至少要指定一个KEY
DEL KEY [KEY ...]
5)检查指定的KEY是否存在。指定一个KEY时,存在返回1,不存在返回0。可以指定多个,返回存在的KEY的数量。
EXISTS KEY
6)在现有的KEY中随机返回一个
RANDOMKEY
7)重命名一个KEY,NEWKEY不管是否是已经存在的都会执行,如果NEWKEY已经存在则会被覆盖。
RENAME KEY NEWKEY
8)只有在NEWKEY不存在时能够执行成功,否则失败
RENAMENX KEY NEWKEY
9)以秒为单位查看KEY还能存在多长时间
TTL KEY
10)给一个KEY设置在SECONDS秒后过期,过期会被Redis移除。
EXPIRE KEY SECONDS
11)移除过期时间,变成永久key
PERSIST KEY
List类型操作
1)从左边添加数据
LPUSH key value [value ...]
2)从右边添加数据
RPUSH key value [value ...]
3)根据list集合的索引打印元素数据
正着数:0,1,2,3,…
倒着数:-1,-2,-3,…
LRANGE key start stop
4)list集合的长度
LLEN key
5)从左边弹出一个元素。
弹出=返回+删除。
LPOP key
6)从右边弹出一个元素。
RPOP key
7)从source中RPOP一个元素,LPUSH到destination中
RPOPLPUSH source destination
8)根据索引从集合中取值
LINDEX key index
9)在pivot指定的值前面或后面插入value
LINSERT key BEFORE|AFTER pivot value
10)只能针对存在的list执行LPUSH
LPUSHX key value
11)根据count指定的数量从key对应的list中删除value
LREM key count value
12)把指定索引位置的元素替换为另一个值
LSET key index value
13)仅保留指定区间的数据,两边的数据被删除
LTRIM key start stop
Set类型操作
1)向set集合添加数据
SADD key member [member ...]
2)查看set集合所有数据
SMEMBERS key
3)返回集合中元素的数量
SCARD key
4)检查当前指定member是否是集合中的元素
SISMEMBER key member
5)从集合中删除元素
SREM key member [member ...]
6)将指定的集合进行“交集”操作
集合A:a,b,c
集合B:b,c,d
交集:b,c
SINTER key [key ...]
7)取交集后存入destinationsin
SINTERSTORE destination key [key ...]
8)将指定的集合执行“差集”操作
集合A:a,b,c
集合B:b,c,d
A对B执行diff:a
相当于:A-交集部分
SDIFF key [key ...]
SDIFFSTORE destination key [key ...]
9)将指定的集合执行“并集”操作
集合A:a,b,c
集合B:b,c,d
并集:a,b,c,d
SUNION key [key ...]
SUNIONSTORE destination key [key ...]
10)把member从source移动到destination
SMOVE source destination member
11)从集合中随机返回count个数量的元素,count不指定就返回1个
SRANDMEMBER key [count]
12)从集合中随机弹出count个数量的元素,count不指定就弹出1个
SPOP key [count]
Hash类型操作
1)添加数据
HSET key field value
2)查询一个key的所有数据
HGETALL key
3)查询一个key对应field的数据
HGET key field
4)查询一个key的数据个数
HLEN key
5)查询一个key的所有field
HKEYS key
6)查询一个key的所有value
HVALS key
7)判断一个key中是否存在指定的field
HEXISTS key field
8)删除一个key指定的field
HDEL key field [field ...]
9)给一个key的某个field对应的value增加increment值
HINCRBY key field increment
10)批量获取一个key的多个field
HMGET key field [field ...]
11)批量添加一个key的多个field-value
HMSET key field value [field value ...]
12)在字段不存在时添加数据
HSETNX key field value
ZSet类型操作
1)添加数据
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
2)在指定范围内返回数据
ZRANGE key start stop [WITHSCORES]
3)查询key对应的数据个数
ZCARD key
4)返回对应数据的分数
ZSCORE key member
5)给某个元素增加分数
ZINCRBY key increment member
6)在分数的指定区间内返回数据
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
7)先对分数进行升序排序,返回member的排名
ZRANK key member
8)先对分数进行降序排序,返回member的排名
ZREVRANK key member
9)删除元素
ZREM key member [member ...]