目录
一、什么是redis?
Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(string), 散列(hashe), 列表(lists), 无序集合(set),有序集合(zset)等。
redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。
1、为什么使用redis呢?
某些操作不需要持久化到数据库,例如前端页面广告位数据无需每次查询后台系统的接口,可以在前台系统添加缓存,提高访问首页的速度。这个时候redis就起到了作用。
2、列式数据库:
3、redis适用于什么场景?
(1)配合关系型数据库做高速缓存配合关系型数据库做高速缓存
•高频次,热门访问的数据,降低数据库IO
•分布式架构,做session共享
(2)由于其拥有持久化能力,利用其多样的数据结构存储特定的数据
4、单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。
二、Redis的操作命令
1、配置redis
#后台启动
daemonize no
pidfile /var/run/redis.pid
port 6379
#设置密码
requirepass 123456
#开启远程连接
protected-mode no
2、连接redis服务
[root@hdp-1 src]# ./redis-server ../redis.conf
3、连接redis客户端
[root@hdp-1 src]# ./redis-cli
127.0.0.1:6379>
4、关于key基础操作
127.0.0.1:6379> auth 123456 #登陆密码
OK
127.0.0.1:6379> keys * #显示所有key
1) "shopId_2"
2) "username"
#查看key是否存在,可查多个
127.0.0.1:6379> exists username
(integer) 1
127.0.0.1:6379> exists username shopId_2
(integer) 2
#清空当前库
flushdb
#清空所有库
flushall
#查看当前库的key数量
dbsize
#查看值的类型
type key
#删除某个键
del key
#为键值设置过期时间,单位秒
expire key seconds
#查看键还有多久过期,-1表示永不过期,-2表示已过期
tt1 key
#选择数据库,默认16个
127.0.0.1:6379> select 8
OK
三、Redis五大数据结构
1、字符串(String)
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
set "xixi" haha
get xixi
#同时设置多个kv
mset key1 value1 key2 value2 ...
#同时设置多个kv,仅当key不存在
msetnx key1 value1 key2 value2 ...
#同时获取多个value
mget key1 key2
exists xixi #是否存在xixi键
append xixi "ok" #追加
getset xixi woshihaha #同时赋值获取,相同key的值会被覆盖
del xixi #删除键值
incr num #对数值类型value递增, 不存在按0进行增减
decr num #对数值类型value递减
incrby num 5 #指定增加数值
#获取值的长度
strlen key
#key不存在赋值
setnx key value
#获得值的范围,类似java中的substring
getrange key 起始位置 结束位置
#用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始。
setrange key 起始位置 value
2、List(单键多值)
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
#从左边/右边插入一个或多个值。
lpush/rpush key value1 value2 ...
#从左边/右边吐出一个值(插入的最后一个是最左边的值)值在键在,值亡键亡。
lpop/rpop key
#从<key1>列表右边吐出一个值,插到<key2>列表左边
rpoplpush key1 key2
#按照索引下标获得元素(从左到右)
lrange <key> <start> <stop>
#按照索引下标获得元素(从左到右)
lindex <key> <index>
#获取列表长度
llen <key>
#在<value>的前面插入<newvalue>
linsert key value newvalue
#从左边删除n个value(从左到右),即删除相同的value n个
lrem key n value
3、Set(无序集合)
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
#将一个或多个元素加入到集合 key 当中,已存在的元素将被忽略。
sadd key value1 value2 ...
#取出该集合的所有值。
smembers key
#判断集合<key>是否为含有该<value>值,有返回1,没有返回0
sismember value
#获取该集合元素个数
scard key
#删除集合中的某个元素。
srem key value1 value2
#随机从该集合中吐出n个值
spop key n
#随机从该集合中取出n个值,不会从集合中删除
srandmember key n
#返回两个集合的交集元素。
sinter key1 key2
#返回两个集合的并集元素。
sunion key1 key2
#返回两个集合的差集元素。
sdiff key1 key2
4、哈希(hash)
string的key,string的value的map,即Map<String,String>
hset info name xin #赋值一个key的hash
hmset infos name xin age 20 #赋值多个key的hash
hget info name #取出一个key的value
hmget infos name age #取出多个key的value
hgetall info #获取所有key的值
hgetall infos
127.0.0.1:6379> hdel infos name age #删除一个或多个key
(integer) 2
127.0.0.1:6379> del infos #删除所有key
(integer) 0
127.0.0.1:6379> hincrby infos age 2
(integer) 22
127.0.0.1:6379> hexists infos age
(integer) 1
127.0.0.1:6379> hlen infos #获取长度,多少个key
(integer) 2
127.0.0.1:6379> hkeys infos #获取所有key 所有value
1) "name"
2) "age"
127.0.0.1:6379> hvals infos
1) "xin"
2) "22"
四、Jedis简单演示
jedis集成了redis的一些命令操作,是封装了redis的java客户端。
添加依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
package redis;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisDemo {
//单实例的测试
@Test
public void simpleTest(){
Jedis jedis = new Jedis("hdp-1",6379);
jedis.auth("123456");
jedis.set("jedis","jedis is active1");
System.out.println(jedis.get("xin"));
System.out.println(jedis.get("jedis"));
jedis.close();
}
//连接池的方法连接
@Test
public void poolTest() {
//获得连接池对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置最大连接数
jedisPoolConfig.setMaxTotal(30);
//设置最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
//获得连接池
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "hdp-1", 6379);
//获得核心组件
Jedis jedis=null;
try{
//通过连接池获取
jedis=jedisPool.getResource();
jedis.auth("123456");
jedis.set("jedispool","this is jedispool");
System.out.println(jedis.get("jedispool"));
}catch (Exception e){
e.printStackTrace();
}finally {
if(jedis !=null){
jedis.close();
}
if(jedisPool !=null){
jedisPool.close();
}
}
}
}