开发环境
JDK 1.8.0
Intellij Ideal
Redis 64.3.0.503
https://github.com/ServiceStack/redis-windows/tree/master/downloads
Redis Desktop Manager
https://redisdesktop.com/
数据库的安装
下载最新版的redit的zip包,直接解压。
为了方便启动,我们可以在目录下新建 startup.cmd, 写入如下内容保存。然后双击启动即可。
redis-server redis.windows.conf
看到如下信息即为连接成功。默认开放6379端口。
用工具Redis Desktop Manager连接
左上角 Connect to Redis Server, 输入name, 本机ip地址和端口号,其他不需要的地方可以保持默认。
连接成功后会在左侧打开db,默认每个连接打开16个.
默认会连接db0,如果想要连接其他 如db2,请使用命令 select 2
*注:
不使用工具,也可以用redits自带的工具连接。
在同路径下的 redis-cli.exe
基本配置说明
它的配置文件在文件路径下 redis.windows.conf
#这里就是设置密码,你可以设置成任何值
requirepass anything
#这里可以改变默认端口
port 6379
#绑定ip地址
bind 127.0.0.1
#设置默认db数量。
databases 16
#指定默认数据库名称
dbfilename dump.rdb
#指定本地存放路径
dir ./
String类型:
它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。
哈希类型:
该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。
列表类型:
该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。
集合类型:
Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。
Set类型主要应用于:在某些场景,如社交场景中,通过交集、并集和差集运算,通过Set类型可以非常方便地查找共同好友、共同关注和共同偏好等社交关系。
顺序集合类型:
ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,其底层也是通过哈希表实现的。
这里只列举string类型和 list类型:
String类型:
设置键为name值为itcast的数据
set name itcast
设置键值为aa,值为bb,及过期时间,以秒为单位
setex aa 3 bb
设置过期时间,以秒为单位
设置键'a1'的过期时间为3秒
expire 'a1' 3
查看有效时间,以秒为单位
ttl key
设置多个键值
mset a1 python a2 java a3 c
追加值
向键为a1中追加值' haha'
append 'a1' 'haha'
获取
获取键值为name的值,如果不存在此键则返回null
get 'name'
多个键获取多个值
获取键a1、a2、a3'的值
mget a1 a2 a3
删除键及对应的值
del a2 a3
List类型:
增加
lpush key value1 value2 ...
例1:从键为'a1'的列表左侧加入数据a 、 b 、c
lpush a1 a b c
在右侧插入数据
rpush key value1 value2 ...
例2:从键为'a1'的列表右侧加入数据0 1
rpush a1 0 1
在指定元素的前或后插入新元素
linsert key before或after 现有元素 新元素
例3:在键为'a1'的列表中元素'b'前加'3'
linsert a1 before b 3
获取
返回列表,指定范围内的元素
start、stop为元素的下标索引
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
lrange key start stop
例4:获取键为'a1'的列表所有元素
lrange a1 0 -1
设置指定索引位置的元素值
索引从左侧开始,第一个元素为0
索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
lset key index value
例5:修改键为'a1'的列表中下标为1的元素值为'z'
lset a 1 z
删除
删除指定元素
将列表中前count次出现的值为value的元素移除
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有
lrem key count value
例6.1:向列表'a2'中加⼊元素'a'、'b'、'a'、'b'、'a'、'b'
lpush a2 a b a b a b
从'a2'列表右侧开始删除2个'b'
lrem a2 -2 b
查看
查看列表'py12'的所有元素
lrange a2 0 -1
其他命令请参考
String类型 | GET/MGET SET/SETEX/MSET/MSETNX INCR/DECR GETSET DEL |
哈希类型 | HGET/HMGET/HGETALL HSET/HMSET/HSETNX HEXISTS/HLEN HKEYS/HDEL HVALS |
列表类型 | LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET LINDEX/LRANGE LLEN/LTRIM |
集合类型 | SADD/SPOP/SMOVE/SCARD SINTER/SDIFF/SDIFFSTORE/SUNION |
顺序集合类型 | ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT ZINTER/ZDIFF/ZDIFFSTORE/ZUNION |
它是redis自带的应对系统高并发请求的计数器。
例子
MyLocal:0>incr num #key被初始化
"1"
MyLocal:0>incr num #存储值增一
"2"
MyLocal:0>get num #数字值在 Redis 中以字符串的形式保存
"2"
其他相关的还有:
incr递增1并返回递增后的结果;
incrby根据指定值做递增或递减操作并返回递增或递减后的结果(incrby递增或递减取决于传入值的正负);
decr递减1并返回递减后的结果;
decrby根据指定值做递增或递减操作并返回递增或递减后的结果(decrby递增或递减取决于传入值的正负);
*后面java代码会做一个redit的并发测试。
在maven中添加
redis.clients
jedis
2.9.0
package com;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import java.util.*;
public class NewApp {
public static void main(String[] args) {
// 连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost",6379);
jedis.select(2);
System.out.println("连接成功");
// 查看服务是否运行
System.out.println("服务正在运行: " + jedis.ping());
jedis.set("城市2", "南京");
String city = jedis.get("城市");
jedis.lpush("tc", "南京");
jedis.lpush("tc", "上海");
jedis.lpush("tc", "苏州");
jedis.lpush("tc", "北京");
jedis.lpush("tc", "南通");
List arr = jedis.lrange("tc", 0, 100);
System.out.println(arr.size());
for (String string : arr) {
System.out.println(string);
}
//Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
//这里要求的是map必须是key和value都是string类型的
Map map=new HashMap<>();
map.put("name", "小明");
map.put("age", "13");
map.put("sex", "男");
map.put("height", "174");
//调用jedis的hmset(存入hash map)的方法将map的键值对存进去
jedis.hmset("people", map);
//新建一个string类型的数组,用于存当时存入redis的map的key值
String[] arr2=new String[4];
arr2[0]="name";
arr2[1]="age";
arr2[2]="sex";
arr2[3]="height";
//利用jedis的hmget方法,从数据库中依次取出对应的map的key值
List list2 = jedis.hmget("people",arr2);
for (int i = 0; i < arr2.length; i++) {
System.out.println("存入键值对为:"+arr2[i]+"--"+list2.get(i));
}
//使用list存入数据
List list=new ArrayList<>();
list.add("北京");
list.add("南京");
list.add("上海");
list.add("北京");
list.add("北京");
list.add("上海");
list.add("苏州");
list.add("南京");
//打印源数据
System.out.println("源数据为"+list);
//因为jedis的sadd的方法,存入的是一个数组对象或者多数据,所有将集合对象转换成数组对象
String[] arr3=new String[list.size()];
for (int i = 0; i < arr3.length; i++) {
arr3[i]=list.get(i);
}
//调用sadd方法存入数据库
jedis.sadd("city", arr3);
Set smembers = jedis.smembers("city");
System.out.println(smembers);
Map map2=new HashMap<>();
map2.put("北京", 1.0);
map2.put("北京", 2.0);
map2.put("南京", 3.0);
map2.put("上海", 4.0);
map2.put("上海", 5.0);
map2.put("南京", 6.0);
//调用jedis的zadd方法存入
jedis.zadd("city2", map2);
//索引在0,到10之间的,分数由高到底的取出所有的集合
Set zrevrange = jedis.zrevrange("city2", 0, 10);
System.out.println(zrevrange);
}
}
package com;
import redis.clients.jedis.Jedis;
import java.util.concurrent.CountDownLatch;
public class MultipleDecrIncr {
/** decr线程数量 */
/** 因为这里增加了10次,减少了9次,最后计数器里是1 */
private static final int DECR_THREAD_COUNT = 9;
/** incr线程数量 */
private static final int INCR_THREAD_COUNT = 10;
private static CountDownLatch begin = new CountDownLatch(DECR_THREAD_COUNT + INCR_THREAD_COUNT);
private static CountDownLatch finish = new CountDownLatch(DECR_THREAD_COUNT + INCR_THREAD_COUNT);
static final String KEY = "string:decr:incr";
public static void main(String[] args) throws InterruptedException {
for(int i = 0; i < DECR_THREAD_COUNT; ++i) {
new DecrThread().start();
//begin.countDown();
}
for(int i = 0; i < INCR_THREAD_COUNT; ++i) {
new IncrThread().start();
//begin.countDown();
}
}
/**
* decr命令线程
*/
static class DecrThread extends Thread {
@Override
public void run() {
//JedisConnect jedisConnect = JedisConnect.getJedisConnect();
Jedis jedis = new Jedis("localhost",6379);
jedis.decr(KEY);
System.out.println("DecrThread");
}
}
/**
* incr命令线程
*/
static class IncrThread extends Thread {
@Override
public void run() {
try {
// begin.await();
//} catch (InterruptedException e) {
} catch (Exception e) {
e.printStackTrace();
}
Jedis jedis = new Jedis("localhost",6379);
jedis.incr(KEY);
System.out.println("IncrThread");
// finish.countDown();
}
}
public static class MyThread extends Thread {
public void run() {
System.out.println("MyThread.run()");
}
}
}
感谢:
老皮肉
https://www.cnblogs.com/sheseido/p/11243341.html
葡萄城
https://www.cnblogs.com/powertoolsteam/p/redis.html
我没有三颗心脏
https://www.jianshu.com/p/56999f2b8e3b