http://redis.cn/官网
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库(非关系型数据库,K-V结构)、缓存(最主要的功能,用来存储常用不长变化的数据,减轻数据库的压力)和消息中间件(取完就没有了)。
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)与范围查询, bitmaps, hyperloglogs和 地理空间(geospatial)索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction)[事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
命令:[root@localhost src]# tar -xvf redis-5.0.4.tar.gz
命令:[root@localhost src]# mv redis-5.0.4.tar.gz soft
命令:[root@localhost src]# mv redis-5.0.4 redis
命令:[root@localhost redis]# cd /usr/local/src/redis
命令:[root@localhost redis]# make
命令:[root@localhost redis]# make install
命令:[root@localhost redis]# vim redis.conf
:set nu 显示行号
命令:[root@localhost redis]# redis-server redis.conf 打开redis
命令:[root@localhost redis]# ps -ed |grep redis 检查redis状态
命令:[root@localhost redis]# redis-cli -p 6379进入redis
命令:[root@localhost redis]# redis-cli -p shutdown关闭edis
命令 | 含义 | 运用 |
---|---|---|
set | 添加Key-Value数据 | set key value |
get | 根据key获取数据 | get key |
strlen | 根据key获取长度 | strlen key |
exists | 判断key是否存在 | exists key(1存在反之0) |
del | 删除数据 | del key |
keys | 查找key | keys * /keys nam?/keys n* |
mset | 赋值多个 | mset k1 v1 k2 v2 |
mget | 获取对个key的值 | mget k1 k2 |
append | 对某个key追加 | append k v |
type | 检查某个key的类型 | type k |
select | 切换数据库 | 0-15共16个,默认第一个 |
flushdb | 清空单个数据库 | flushdb |
flushall | 清空所有数据库 | flushall |
incr | 自动加1 | incr k |
decr | 自动减1 | decr k |
incrby | 指定数值增加 | incrby k 10 |
decrby | 指定数值减少 | decrby k 10 |
expire | 指定key的生效时间 秒 | expire k 10 |
pexpire | 指定key的生效时间 毫秒 | pexpire k 100 |
ttl | 检查剩余存活时间 | ttl k(-2不存在-1不超时) |
命令 | 含义 | 运用 |
---|---|---|
hset | 为对象添加数据 | hset obj k v |
hget | 获取对象数据 | hget obj k |
hexists | 判断对象属性是否存在 | hexists obj k |
hdel | 删除对象属性 | hdel obj k |
hgetall | 获取对象全部属性和值 | hgetall obj |
hkeys | 获取所有字段 | hkeys k |
hlen | 获取所有属性的数量 | hlen k |
hmget | 获取hash中指定字段的值 | hmget obj k |
hmset | 为多个字段设定值 | hmset obj k v |
hsetnx | 设定字段当字段不存在时有效 | hsetnx obj k v |
hstrlen | 获取指定key的值长度 | hstrlen obj k |
hvals | 获取hash所有值 | hvals obj |
说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同
命令 | 含义 | 运用 |
---|---|---|
lpush | 左侧入队一个或者多个元素 | lpush k v/[v…] |
rpush | 右侧入队一个或者多个元素 | rpush k v/[v…] |
lpop | 左侧出队一个元素 | lpop k |
rpop | 右侧出队一个元素 | rpop k |
lpushx | 左侧入队一个元素(队列存在) | lpush key v |
rpushx | 右侧入队一个元素(队列存在) | rpushx key v |
lrange | 获取指定的元素 | lrange key start stop |
说明:redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.
命令 | 含义 | 运用 |
---|---|---|
multi | 标记一个事务开始 | jedis.multi |
exec | 执行所有multi之后发出命令 | transaction.exec() |
discard | 丢弃所有multi之后发的命令 | transaction.discard() |
说明:编写程序访问Linux系统上的Redis
实例化一个redis对象,调用里面的`public Jedis(String host, int port) {super(host, port);构造方法进行测试。
前提
1.远程服务器redis已经打开
2.依赖的导入
redis.clients
jedis
${jedis.version}
org.springframework.data
spring-data-redis
1.4.1.RELEASE
@Test
public void test01(){
Jedis jedis = new Jedis("192.168.126.129",6379);
jedis.set("redis","test");
System.out.println(jedis.get("redis"));
}
/**
* 事务的控制
* 说明:操作单台Redis使用于事务控制
* 多台不太适用
*/
@Test
public void testTx() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
Transaction transaction = jedis.multi();
try {
transaction.set("aaa","bbb");
transaction.exec();
}catch(Exception e){
transaction.discard();
}
}
/**
* 添加一个数据,只有数据存在时才会赋值,并且要添加超时时间,保证原子性操作
*
* private static final String XX = "xx"; //有key的时候才赋值
* private static final String NX = "nx"; //没有key的时候才赋值
* private static final String PX = "px"; //秒
* private static final String EX = "ex"; //毫秒
* Redis分布式锁
*/
@Test
public void test05() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
SetParams setParams = new SetParams();
setParams.xx().ex(10);
jedis.set("aaa","aaa",setParams);
}
Redis 工具类要实现的是对象和JSON之间的相互转化。
package com.jt.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.util.StringUtils;
/**
* 实现对象和JSON之间的相互转化
* 1.将任意对象转化为JSON
* 2.将任意的JSON转化为对象
*
*/public class ObjectMapperUtil {
//定义常量对象
//1.节省空间
//2.不能篡改
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 1.将任意对象转化为JSon
* 1.1 任意对象用object对象来接
* 1.2 返回值是JSON串,所以应该是String
* 1.3 使用什么方法转化JSON FASTJSON/objectMapper
*/ public static String toJSON(Object object){
try {
if(object==null){
throw new RuntimeException("传递的参数为空,检查传参!");
}
return MAPPER.writeValueAsString(object);
}catch (JsonProcessingException e){
e.printStackTrace();
//应该将检查异常转化为运行时异常
throw new RuntimeException("转化有误!不支持json转化,检车是否有get/set方法");
}
}
//2.将任意的JSON转化为对象
public static T toObject(String json,Class target){
if(StringUtils.isEmpty(json) || target == null){
throw new RuntimeException("传递参数不能为空");
}
try {
return MAPPER.readValue(json,target);
}catch (JsonProcessingException e){
e.printStackTrace();
throw new RuntimeException("json 转化异常");
}
}
}
@Test
public void test03(){
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(1L)
.setItemDesc("测试")
.setCreated(new Date())
.setUpdated(new Date());
String json = ObjectMapperUtil.toJSON(itemDesc);
ItemDesc itemDesc2 =
ObjectMapperUtil.toObject(json,ItemDesc.class);
System.out.println(json);
System.out.println(itemDesc2);
}