redis常用数据结的存取数据方法
字符串类型 string
散列类型 hash
列表类型 list
集合类型 set
有序集合类型 sortedset
应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
redis安装环境
gcc:yum install gcc-c++
http://download.redis.io/releases/redis-3.0.0.tar.gz
将redis-3.0.0.tar.gz拷贝到/usr/local下
tar -zxvf redis-3.0.0.tar.gz
cd /usr/local/redis-3.0.0
make
cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install
cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
启动,
daemonize yes 以后端模式启动。
./bin/redis-server ./redis.conf
停止
./bin/redis-cli shutdown
连接
./redis-cli -h 192.168.200.137 -p 6379
192.168.200.137:6379> ping
PONG
192.168.200.137:6379> set name zhangsan
ok
192.168.200.137:6379> get name
"zhangsan"
多数据库
192.168.200.137:6379> select 1
ok
192.168.200.137:6379> get name
(nil)
注:flushall 会清空当前实例, 也就是清空0~15的数据库
Jedis连接redis单机
pom坐标:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
commons-pool12-2.3.jar
jedis-2.7.0.jar
@Test public void testJedisSingle() { Jedis jedis = new Jedis("192.168.101.3", 6379); jedis.set("name", "bar"); String name = jedis.get("name"); System.out.println(name); jedis.close(); } @Test public void pool() { JedisPoolConfig config = new JedisPoolConfig(); //最大连接数 config.setMaxTotal(30); //最大连接空闲数 config.setMaxIdle(2); JedisPool pool = new JedisPool(config, "192.168.101.3", 6379); Jedis jedis = null; try { jedis = pool.getResource(); jedis.set("name", "lisi"); String name = jedis.get("name"); System.out.println(name); }catch(Exception ex){ ex.printStackTrace(); }finally{ if(jedis != null){ //关闭连接 jedis.close(); } } }
jedis与spring整合
<!-- 连接池配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 最大连接数 --> <property name="maxTotal" value="30" /> <!-- 最大空闲连接数 --> <property name="maxIdle" value="10" /> <!-- 每次释放连接的最大数目 --> <property name="numTestsPerEvictionRun" value="1024" /> <!-- 释放连接的扫描间隔(毫秒) --> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <!-- 连接最小空闲时间 --> <property name="minEvictableIdleTimeMillis" value="1800000" /> <!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 --> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 --> <property name="maxWaitMillis" value="1500" /> <!-- 在获取连接的时候检查有效性, 默认false --> <property name="testOnBorrow" value="true" /> <!-- 在空闲时检查有效性, 默认false --> <property name="testWhileIdle" value="true" /> <!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true --> <property name="blockWhenExhausted" value="false" /> </bean> <!-- redis单机 通过连接池 --> <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close"> <constructor-arg index="0" ref="jedisPoolConfig"></constructor-arg> <constructor-arg index="1" value="192.168.101.3"></constructor-arg> <constructor-arg index="2" value="7001"></constructor-arg> </bean>
private ApplicationContext applicationContext; @Before public void init() { applicationContext = new ClassPathXmlApplicationContext( "classpath:applicationContext.xml"); } @Test public void testJedisPool() { JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool"); try { jedis = pool.getResource(); jedis.set("name", "lisi"); String name = jedis.get("name"); System.out.println(name); }catch(Exception ex){ ex.printStackTrace(); }finally{ if(jedis != null){ //关闭连接 jedis.close(); } } }
命令
--String SDS(simple dynamic string)即简单动态字符串。
递增, 递减, 追加, 长度,
set key value
get key 当键不存在时返回空结果。(nil)
incr key 返回递增后的值, 不支持递增会报错, incr key [num]
decr key
append key value 向值的末尾追加value,返回加后字符串的总长度
strlen key 获取值的长度
mset key1 value [key2 value ...]
mget key1 key2 key3...
--Hash
设置字段值, 字段是否存在, 字段值自增, 带条件设置字段值, 获取字段名, 获取字段值, 获取字段个数
hset key field value HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0.
get key field
hmset key field1 value1 [field2 value2....]
hmget key field1 [dield2]
hgetall key
hexists key field 判断字段是否存在返回1, 不存在返回0
hsetnx key field value 当字段不存在时赋值返回1,类似HSET,区别在于如果字段已经存在,该命令不执行任何操作返回0。
hincrby user age 5 将用户的年龄加2
hdel key field1 [dield2...]
hkeys key
hvals key
hlen key
--List 列表 有序不唯一
向左或右添加value, 从左或右弹出value, 获取个数, 查看某一段
获取某个位置的value, 设置某个位置的value
只保留某一段, 插入都某个value的前或后面, 移动元素到另一个列表
lpush key value [value....]
rpush key value [value....]
lpop key
rpop key
llen key
lrange key 2 -1 取出一个片段索引2到最后
lrem key count value 删除count个vlaue, 正从前开始,负从后开始,0删除所有值为value的字段
lindex key index 获取指定索引的value值
lset key index value 设置指定索引的value值
ltrim key start stop 只保留列表指定片段
linset key before|after value anthervalue 从左往右查找value, 把anthervalue插入before或者after
rpoplpush source destination 将元素从一个列表转移到另一个列表中
--set 集合 无须唯一
加入, 删除, 判断是否存在, 获取个数
集合之间的交集, 并集, 差集
sadd key member [member...] 有改变返回有效的个数, 否则返回0个
srem key member [member..] 返回成功随机删除的个数, 否则返回0个
smembers key
sismember key value 是否存在value, 返回1, 不存在返回0
sdiff key1 key2 返回key1中独有的元素key1-key2
sinter set1 set2 返回set1和set2的交集
sunion setA setB 返回setA 和 setB的并集(出重复的元素)
scard key 获取个数
spop key 从集合中随机选择一个元素弹出
--sorted set 有序集合类型为集合中的每个元素都关联一个分数
添加, 获取元素分数, 根据索引范围查, 根据分数范围查
给元素加分数, 获取元素个数, 获取某个分数范围的个数
zadd key score member [score member ...]
zscore key member 获取 元素 分数
zcount key min max 获取 分数范围内 元素个数
zrank key member 获取 元素 索引
zrevrank key member 获取 元素 倒排索引
zincrby key score member 给member加incremen分数, 返回加后的分数
zrange key start stop [withscores] 分数从小到大 索引从start到stop之间的所有元素(包含两端的元素)
zrevrange key start stop 分数从大到小 索引从start到stop之间的所有元素(包含两端的元素)
zrangebyscore key min max withscores limit 0 5 分数从min到max的元素, 从0个开始查5个
zcard key 获取元素的个数
zremrangebyrank key start stop 按排序范围删除
zremrangebyscore key min max 按分数范围删除
--keys
expire key seconds 设置key的生存时间
ttl key 查看剩余的时间
persist key 清楚生存时间
pexpire key milliseconds 生存时间设置单位为: 毫秒
keys my*
exists key
del key
rename key
type key
dbsize 当前数据库的key的个数
info
flushdb
flushall