http://redisdoc.com/string/index.html 中文文档

redis 特性

内存数据库
区分数据类型,并且各数据类型都内置了本地方法(memcache 没有本地方法)
工作线程是单线程,另外还有IO线程、持久化线程。 单线程使得redis天生就具有串行化特性
key - value 存储数据, 仅关注数据本身,而不维护数据间的关系
二进制安全,redis只存储二进制数据,不处理任何编码
使用epoll模型处理scoket连接
可以直接操作, 因其已在内存之中

redis 5种基本的类型

String Hash List Set ZSet

String

字符串 :
数值 : 数值计算
bitmap : setbit

List

双向链表结构,同时支持反向序号查找,-2代表反向链第二个。
可以左右两边压入(lpush 、rpush), 可以左右两边弹出( lpop 、rpop)。
压入和弹出指令同向时,即栈(先进先出)
压入和弹出指令异向时,即队列(后进先出)
Ltrim int int ,删除范围之外的数据,保留热数据

Hash

将数据分组,以提高检索效率。 同时间接的也会减少最顶层key的数量
Hset key key value —设置数据
Hget key key —取出数据
Hvals key — 取出所有的 值
Hkey key — 取出所有的 key
同时也支持数值的加减 Hincrby key key 1

Set

无序集合 不重复 放入位置基于hashcode
引入(在java中 HashSet的底层是个HashMap,其value为null)
sadd key xxx
srandnumber key 3 随机返回3个不重复的值
srandnumber key -3 随机返回3个值,值可以重复,即一个值会随机多次出现
sunion key1 key2 返回并集
sinter key1 key2 返回交集
sdiff key1 key2 返回减集 存在于key1内同时不存在于key2内

Zset (sorted set)

有序集合
给元素配置 score 的属性
其命令都是Z开头,因为S开头的已经被Set使用了
zadd key 0.4 value 0.7 value
zrank key 0 -1 withscores 取出所有的元素,从小到大排列
zrevRank key 0 1 取最大元素的前两个 ,rev 从大到小排列

会用跳跃表来存储,即分层索引表。
ziplist 最初使用ziplist
skiplist(跳跃表), 当集合中元素超过某个条数,或某个元素的字节非常长,则会自动转换为skiplist存储

redis 的应用场景

  • 可将程序中的数据结构,迁移到redis 。 防止程序挂掉数据丢失 。 这样就实现了服务无状态 ()
  • 秒杀: 商品数目存放在redis中,其响应速度非常快,同时redis单工作线程的特性,使并发请求自动串行化,无需加锁即可处理并发时超卖的问题。
  • 二进制矩阵: setbit 及二进制运算 ,占用空间非常小
  • 微信抢红包:将金额都分配好 push到list中,抢的时候pop一个。 不用再计算,响应速度极快,同时不用担心并发的问题。 红包分配的金额不能放在应用的内存中,这样服务就有了状态,应用挂掉了所有状态都受影响。
  • 使用set的交并差集,可以找到共同好友、推荐好友
  • Zset 做动态排行榜 , 评论排序(如按点赞数排序) 同时动态分页,

    redis 在java中的基本应用

  1. redis封装好了jedis包支持java与redis的交互 ,引入jedis包

    redis.clients
    jedis
    3.5.2

  2. 与redis服务建立连接
    Jedis jedis = new Jedis(“localhost”,6379);
    jedis.close(); //使用完成后需关闭

  3. 基于jedis 对象来与Redis数据库交互
    jedis.set(“strKey”,”neirong”);
    String str = jedis.get(“strKey”);

  4. 也可使用连接池处理连接

// 获取连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 设置最大连接数
config.setMaxTotal(30);
// 设置最大的空闲连接数
config.setMaxIdle(10);
// 获得连接池: JedisPool jedisPool = new JedisPool(poolConfig,host,port);
JedisPool jedisPool = new JedisPool(config,”localhost”,6379);
//获取连接
Jedis jedis = jedisPool.getResource();
//使用完成后关闭
jedis.close();

redis的基本理论及java应用 - 图1