一、安装redis
1、下载redis
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
2.解压
tar xzvf redis-4.0.8.tar.gz -C /usr/local/
3.安装(如果没有gcc环境,需要安装gcc:yum install gcc-c++)
cd /usr/local/
mv redis-4.0.8 redis
cd redis
make
cd ./src
make install PREFIX=/usr/local/redis
4、移动配置文件到安装目录下
cd /usr/local/redis
mkdir /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
5、配置redis为后台启动
vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes
6、开启redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
8、将redis-cli,redis-server拷贝到bin下,让redis-cli指令可以在任意目录下直接使用
cp /usr/local/redis/bin/redis-server /usr/local/bin/
cp /usr/local/redis/bin/redis-cli /usr/local/bin/
9、设置redis密码
(1)运行命令:redis-cli
(2)运行命令:config set requirepass ****(****为你要设置的密码),设置成功的话会返回‘OK’字样
(3)测试连接,重启redis服务
(4)进入命令行模式:redis-cli -h 127.0.0.1 -p 6379 -a ****(****为你设置的密码)
10、让外网能够访问redis
修改redis.conf文件
(1)注释掉127.0.0.1
(2)把protected-mode yes 改为 no
二、Java API
1、pom.xml
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
2、 单实例连接redis
@Test
public void testJedisSingle() {
//创建jedis对象,需要指定Redis服务的ip和端口
Jedis jedis = new Jedis("192.168.100.102", 6379);
//直接操作数据库
jedis.set("name", "bar");
//获取数据
String name = jedis.get("name");
System.out.println(name);
//关闭jedis
jedis.close();
}
运行后在查看
3、Redis Java List(列表) 实例
@Test
public void RedisListJava () {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("192.168.100.102", 6379);
System.out.println("连接成功");
//存储数据到列表中
jedis.lpush("site-list", "Runoob");
jedis.lpush("site-list", "Google");
jedis.lpush("site-list", "Taobao");
// 获取存储的数据并输出
List<String> list = jedis.lrange("site-list", 0 ,2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表项为: "+list.get(i));
}
}
运行后在查看
4、使用连接池连接
@Test
public void pool() {
JedisPoolConfig config = new JedisPoolConfig();
//最大连接数
config.setMaxTotal(30);
//最大连接空闲数
config.setMaxIdle(2);
JedisPool pool = new JedisPool(config, "192.168.100.102", 6379);
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("name", "zhangsan");
String name = jedis.get("name");
System.out.println(name);
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(jedis != null){
//关闭连接
jedis.close();
}
}
}
运行后在查看
三、简单的秒杀案例
1、TestMs.java
package com.hadoop.redis;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import redis.clients.jedis.Jedis;
public class TestMs {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.100.102");
jedis.set("iphone8","100");
jedis.close();
//玩多线程
ExecutorService executor = Executors.newFixedThreadPool(20);
for(int i = 0 ; i < 1000; i++){
executor.execute(new SaleRunable("user"+i));
}
executor.shutdown();
}
}
2、SaleRunable.java
package com.hadoop.redis;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
public class SaleRunable implements Runnable{
String productKey="iphone8";//监视的key 当前秒杀商品的数量
Jedis jedis = new Jedis("192.168.100.102");
String userName;
public SaleRunable(String userName){
this.userName = userName;
}
@Override
public void run(){
//商品的key , 秒杀有个数量
//watch 监视一个key,当事务执行之前这个key发生了改变,事务会被打断
jedis.watch(productKey);
String value = jedis.get(productKey);
int num = Integer.valueOf(value);
//这次秒杀的商品是100个iphone8
if(num<=100&&num>=1){
//开启事务
Transaction tx = jedis.multi();
//减少一个商品数量
tx.incrBy(productKey, -1);
//提交事务,如果商品数量发生了改动 则会返回null
List<Object> list = tx.exec();
if(list==null || list.size()==0){
System.out.println(userName+"商品抢购失败!");
}else{
for(Object success : list){
System.out.println(userName+"("+success.toString()+")商品抢购成功,当前抢购成功的人数是:"+(1-(num-100)));
}
}
}else{
System.out.println(userName+"商品已经被抢完了");
}
jedis.close();
}
}
3、运行TestMs.java程序