一.windows下的redis使用
下载压缩包
下载Redis 配置Redis.conf>>>寻找 requirepass 密码 , port 6379 端口号
出现如下界面表示配置成功!
优点:
1.低延迟的读写速度:应用快速的反应能极大地提高用户满意度
2、支持海量的数据与流量:对于搜索大型应用而言,需要利用PB级别的数据和反应能力应对百万级流量
3、大规模集群的管理:系统管理员 希望分布式应用能更简单的部署和管理
4、庞大的运营成本的考量:IT部门希望在硬件成本 和软件 与 人力的成本上能否大幅的降低
NoSQL应用:高性能、可扩展性强、高可用等等……
Redis是什么
Redis是现在最受欢迎的NoSQL数据库之一,是使用ABSI C编写的开源,包含多种数据结构、支持网络、基于内存、可选持久的键值对存储数据库,具备特点:
1、基于内存运行,性能高效
2、支持分布式、理论上可以无限的扩展
3、key -value存储系统
4、开源 遵守BSD协议、支持网络、基于内存可以选择持久化日志,提供多种语言API
相对于其他的数据库类型,Redis具备的特点:
1、C/S 通讯模型
2、单进程单线程模型
3、丰富的数据类型
4、持久化
5、高并发
6、支持LUA脚本
哪些大厂在使用Redis?
GitHub、微博、阿里、百度、美团、搜狐
Redis介绍
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。
Redis 与 Memcached 区别
- Memcached是多线程,而Redis使用单线程。(个人认为Memcached在读写处理速度上优于Redis)
- Memcached使用预分配的内存池的方式,Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存。
- Redis可以实现持久化(也就是说redis需要经常将内存中的数据同步到硬盘中来保证持久化),主从复制,实现故障恢复。
- Memcached只是简单的key与value,但是Redis支持数据类型比较多。包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
Redis支持两种持久化方式:
(1):snapshotting(快照)也是默认方式.(把数据做一个备份,将数据存储到文件)
(2)Append-only file(缩写aof)的方式
这种方式是将内存中数据以快照的方式写到二进制文件中,默认的文件名称为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key键修改就自动做快照.
aof方式:由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
Redis类型:
String类型:
他是一个二进制安全的字符串,意味着它不仅能够存储字符串,还能存储图片、视频等多种类型(注意:最大长度支持512M)
哈希类型:
该类型field和关联的value组成的Map,field和value是都字符串类型的
列表类型:
该类型是一个插入顺序排序的字符串元素集合,基于双链表实现
集合类型:
Set类型是一种无序的集合,他和LIST类型最大的区别是:集合中的元素没有顺序,且元素是唯一的。
顺序集合类型:
Zset是一种有序的集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,但是底层也通过了哈希表实现。
使用
搭建项目:
1、导入 要使用的 依赖
<!-- jedis依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.1</version>
</dependency>
Spring与Redis整合的依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6.2.RELEASE</version>
</dependency>
引入JSON依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.1.0</version>
</dependency>
API
1.对value操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个key
rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
2.对String操作的命令
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value
setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i
msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串
3.对List操作的命令
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值为value
lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0 从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop 命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果 timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。
brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
4.对Set操作的命令
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
scard(key) :返回名称为key的set的基数
sismember(key, member) :测试member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合
sunion(key1, key2,…key N) :求并集
sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合
sdiff(key1, key2,…key N) :求差集
sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
5.对zset(sorted set)操作的命令
zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
zrem(key, member) :删除名称为key的zset中的元素member
zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”
zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素
zcard(key):返回名称为key的zset的基数
zscore(key, element):返回名称为key的zset中元素element的score
zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素
zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素
zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行 SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
6.对Hash操作的命令
hset(key, field, value):向名称为key的hash中添加元素field<—>value
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
测试:
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class MyTest {
@Test
public void test1(){
//参数是主机名和端口地址
Jedis jedis = new Jedis("localhost",6379);
//设置连接密码
jedis.auth("123456");
System.out.println("连接成功");
System.out.println(jedis.flushDB());//清空数据库
System.out.println(jedis.echo("hello"));//返回当前字符串本身,等同于sout("hello")
//将字符串存储到reids中
System.out.println(jedis.set("wuhu","wuhu"));
//exists方法用来判断key是否存在
System.out.println(jedis.exists("wuhu"));
//随机返回一个key,如果数据库中没有key,返回null
String randomKey = jedis.randomKey();
System.out.println(randomKey);
// 通过expire 方法 使用key设置 过期时间
Long aLong = jedis.expire("wuhu", 60);
System.out.println(aLong);//1
// 获取key的有效时间 (毫秒)
System.out.println(jedis.pttl("wuhu"));//60000
//移除key有效时间
System.out.println(jedis.persist("wuhu"));//1
// 获取key的数据类型 Stirng list set.... none>>表示不存在
System.out.println(jedis.type("wuhu"));//string
// 使用新的key 替换旧的key
System.out.println(jedis.renamenx("wuhu","new wu hu"));//
System.out.println("wuhu是否存在:"+jedis.exists("wuhu"));//false
System.out.println("new wu hu是否存在:"+jedis.exists("new wu hu"));//true
System.out.println("=====================");
/*
模糊查询 通配符的使用
* 任意长度的值
*2 查询 已2结尾的key
2* 查询 已2开头的key
*2* 查询 包含2开头的key
*/
Set<String> setKey = jedis.keys("n[ewsart]*");
System.out.println(setKey);//[new wu hu]
}
}
String 的操作:
@Test
public void test2(){
//参数是主机名和端口地址
Jedis jedis = new Jedis("localhost",6379);
//设置连接密码
jedis.auth("123456");
System.out.println("连接成功");
//新增数据到redis中set("key","value");
jedis.set("aha","金色传说");
//通过key获取value
System.out.println(jedis.get("aha"));//金色传说
//通过key 覆盖原有值
jedis.set("aha","金色传说222");
System.out.println(jedis.get("aha"));//金色传说222
//新增数据 添加 过期时间 2秒,线程可能不安全,Thread.sleep
jedis.setex("aaa",2,"qifei");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(jedis.get("aaa"));//null
//一次添加多个key-value 对
jedis.mset("a","1","b","2");
// 获取 a,b对应的value
List<String> values = jedis.mget("a","b");
System.out.println(values);//[1, 2]
//批量删除
jedis.del("a","b");
values = jedis.mget("a","b");
System.out.println(values);//[null, null]
jedis.close();
}