redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis下载地址 https://github.com/MSOpenTech/redis/releases
具体的dos命令操作 欢迎下载文档 点击打开链接
服务器端常用命令
命令 | 描述 | 例子 |
ping | 检查链接是否存活 | ping,返回pong,则存活 |
echo | 在命令行打印内容 | echo context |
info | 获取服务器上的信息和统计 | info |
quit | 退出客户端 | quit |
select | 选择数据库 | select dbno |
dbsize | 返回当前数据库中key的数目 | dbsize |
flushdb | 删除当前数据库中的所有key | flushdb |
flushall | 删除所有数据库中的所有key | flushall |
1、在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
命令 | 描述 | 例子 |
set | 赋值 | set key value |
get | 获取值 | get key |
append | 追加字符串 | append key value |
incr | 自增(+1) | incr key |
decr | 自减(-1) | decr key |
incrby | 自增,增加指定步长 | incrby key increment |
decrby | 自减,减少指定步长 | decrby key decrement |
getset | 先获取元素再赋值 | getset key value |
setex | 赋值并指定key的存活时间 | setex key second value |
命令 | 描述 | 例子 |
setnx | key不存在就赋值,否则不做操作 | setnx key value |
strlen | 返回key的值的长度 | strlen key |
setrange | 字符串替换(包含start) | setrange key start value |
getrange | 获取指定位置字符串 | getrange key start end |
mset | 同时设置多个key value | mset key value [key2 value2...] |
mget | 同时获取多个key的值 | mget key [key2...] |
msetnx | key不存在同时设置多个key value,否则不设置 | msetnx key value [key2 value2] |
setbit | 设置二进制的值 | setbit key offset value |
getbit | 获取二进制的值 | getbit key offset |
1、hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
命令 | 描述 | 例子 |
hset | 给key中的filed字段赋值 | hset key field value |
hget | 获取可以中filed字段的值 | hget key field |
hexists | 判断key中是否存在filed | hexists key field |
hlen | 获取key中filed的数量 | hlen key |
hdel | 删除key中的filed字段 | hdel key field [field2..] |
hgetall | 获取key中所有的field和value | hgetall key |
hmset | 同时设置多个field和value | hmset key field value [field2 value2..] |
hmget | 同时获取多个field的值 | hmget key field [field2..] |
hsetnx | 如果field不存在赋值,否则不操作 | hsetnx key field value |
hincrby | 给field的值增加指定的步长 | hincrby key field increment |
hkeys | 获取所有的key | hkeys key |
hvals | 获取所有的value | hvals key |
1、列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
命令 | 描述 | 例子 |
lpush | 在list头部添加值 | lpush key value [value2..] |
rpush | 在list尾部添加值 | rpush key value [value2..] |
lrange | 获取指定位置的数据 | lrange key start end |
lpop | 从头部弹出key的值(删除) | lpop key |
rpop | 从尾部弹出key的值(删除) | rpop key |
rpoplpush | 从一个list的尾部弹出插入到另一个list的头部 | rpoplpush source destnation |
命令 | 描述 | 例子 |
llen | 返回key的长度 | llen key |
lrem | 删除前面几个值为value的元素 | lrem key count value |
lset | 按下标赋值 | lset key index value |
lindex | 返回下标的值 | lindex key index |
ltrim | 截取list 指定位置的值 | ltrim key start end |
linsert | 在某个元素的前面或后面插入值 | linsert key before|after pivot value |
lpushx | key存在头部添加,否则不做操作 | lpushx key value |
rpushx | key存在在尾部添加,否则不做操作 | rpushx key value |
1、set就是集合类型,集合中每个元素都不相同,且没有顺序。
命令 | 描述 | 例子 |
sadd | 添加值 | sadd key member [member2] |
smembers | 遍历集合 | smembers key |
scard | 获取key的成员数量 | scard key |
srem | 删除指定成员 | srem key member [member2..] |
sismember | 判断成员是否存在 | sismember key member |
spop | 随机弹出一个值(删除) | spop key |
命令 | 描述 | 例子 |
srandmember | 随机弹出一个成员(不删除) | srandmember key |
smove | 移动一个集合的成员到另一个集合 | smove source destination member |
sdiff | 求集合的差集 | sdiff key [key2..] |
sdiffstore | 求集合的差集并存到新集合中 | sdiffstore destination key [key2..] |
sinter | 求集合交集 | sinter key [key2..] |
sinterstore | 求集合交集并存到新集合中 | sinterstore destination key [key2..] |
sunion | 求集合并集 | suion key [key2..] |
sunionstore | 求集合并集并存到新集合中 | suionstore destination key [key2..] |
1、在集合类型的基础上有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
2有序集合和list类型二者有着很大区别:
1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后, 访问中间数据的速度会变慢。
2)有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
3)列表中不能简单的调整某个元素的位置,但是有序集合可以
4)有序集合要比列表类型更耗内存。
命令 | 描述 | 例子 |
zadd | 添加成员 | zadd key score member [score member..] |
zcard | 获取成员数量 | zcard key |
zcount | 获取指定分数之间的成员数量 | zcount key min max |
zincrby | 给成员增加指定分数 | zincrby key increment member |
zrange | 遍历指定下标之间的成员[及分数](分数从小到大排列) | zrange key start end [withscores] |
zrangebyscore | 遍历指定分数之间的成员(及分数) | zrangebyscore key min max [withscores] |
zrank | 返回成员的下标(分数从小到大排列) | zrank key member |
zrem | 删除指定成员 | zrem key member [member2..] |
zrevrange | 遍历指定成员[及分数](分数从大到小排列) | zrevrange key start end [withscores] |
命令 | 描述 | 例子 |
zrevrank | 返回成员下标(分数从大到小) | zrevrank key member |
zscore | 获取指定成员的分数 | zscore key member |
zrevrangebyscore | 获取在指定分数之间的成员[及分数](分数从高到低) | zrevrangebyscore key max min [withscores] |
zremrangebyrank | 删除下标之间的成员 | zremrangebyrank key start end |
zremrangebyscore | 删除指定分数之间的成员 | zremrangebyscore key min max |
命令 | 描述 | 例子 |
keys | 获取所有的key | keys pattern |
del | 删除指定key | del key [key2..] |
exists | 判断key是否存在 | exists key |
move | 移动一个key到另一个库中 | move key db |
rename | 给key重新命名 | rename key newkey |
renamenx | 给key重新命名,当newkey存在是不操作 | renamenx key newkey |
persist | 将key持久化 | persist key |
命令 | 描述 | 例子 |
expire | 设置key的存活时间 | expire key sexonds |
expireat | 设置key的存活时间(年月日}时间戳 | expireat key timestamp |
ttl | 实时查看key的剩余存活时间 | ttl key |
pttl | 查看key的剩余存活时间(毫秒) | pttl key |
randomkey | 随机返回一个key | randomkey |
type | 返回key中的value的类型 | type key |
select |
一个缓存的小案例 记得添加redis的jar包
对象和字节的相互转换工具类
package cn.et;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObjectUtils {
/**
* 将对象转换为字节数组
* @param obj
* @return
* @throws IOException
*/
public static byte[] objectToByte(Object obj) throws IOException{
ByteArrayOutputStream boas=new ByteArrayOutputStream();
ObjectOutputStream oops=new ObjectOutputStream(boas);
oops.writeObject(obj);
oops.close();
return boas.toByteArray();
}
/**
* 将字节数组转换为对象
* @param obj
* @return
* @throws IOException
*/
public static Object byteToObject(byte[] src) throws Exception{
ByteArrayInputStream boas=new ByteArrayInputStream(src,0,src.length);
ObjectInputStream ois=new ObjectInputStream(boas);
return ois.readObject();
}
}
package cn.et;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import redis.clients.jedis.Jedis;
public class Client {
public static List<Map> list=new ArrayList<Map>();
/**
* 模拟有多个用户 发送的订单请求 模拟2个 淘宝
*/
static{
Map map=new HashMap();
map.put("cid", 1);
map.put("count", 2);
map.put("price", 200);
list.add(map);
Map map1=new HashMap();
map1.put("cid", 2);
map1.put("count", 1);
map1.put("price", 10);
list.add(map1);
}
static Jedis jedis=new Jedis();
final static String ORDER_KEY="orderList";
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
for(int i=0;i<list.size();i++){
final Map map=list.get(i);
//往list尾部添加值 并以字节存储到redis中
jedis.rpush(ORDER_KEY.getBytes(),ObjectUtils.objectToByte(map));
}
}
}
从redis缓存中读取数据
package cn.et;
import java.util.Map;
import redis.clients.jedis.Jedis;
public class Order {
static Jedis jedis = new Jedis();
final static String ORDER_KEY = "orderList";
public static void main(String[] args) throws Exception {
byte[] srcByte = jedis.lpop(ORDER_KEY.getBytes());
Map map = (Map) ObjectUtils.byteToObject(srcByte);
System.out.println(map.get("cid"));
}
}