Redis
基本指令:
-
登录redis服务:
- 登录本地redis
redis-cli 或 redis-cli -p 6379 或 redis-cli -p 6379 - a password #-a后面为password,此操作需要开启redis.conf文件中的requirepass选项
-
登录远程redis
redis-cli -h ip -p 6379 -a password
-
登录redis后在redis中的指令
-
1.查看redis信息:info 2.清空redis屏幕:clear 3.退出redis服务:exit 4.关闭redis服务:shutdown 5.系统帮助:help
-
-
redis数据存储操作
-
1.基于查看reids中的key:keys * 2.基于key/value形式存储数据:set key value 3.基于key获取redis中存储的数据:get key 4.清除当前数据库数据:flushdb 5.清除所有数据库数据:flushall 6.key有效时间设计(秒杀操作的计时,缓存数据的有效时长):expire key seconds 7.使用expire后可以查看key剩余时间:ttl key; 8.当返回值为-2时,表示key被删除,当key不存在时,返回-2.当key存在但蜜月设置剩余生存时间时返回-1 9.对特定key设置的生效时长失效:persist key(或者设置新的数据时,需要重新设置该key的生产时间,重新设置值也会清除生存时间) 10.让key的生效时长以毫秒作为计量单位:pexpire key miliseconds
-
redis常用数据类型
redis中基础数据结构包含字符串,散列,列表,集合,有序集合
String类型操作实践:
字符串类型是redis中最简单的数据类型,它存储的值可以是字符串,其最大字符串长度支持到512M。基于此类型,可以实现博客的字数统计,将日志不断追加到指定key,实现一个分布式自增iid,实现一个博客的的点赞操作等
让键的值递增:incr key(如果key不存在,则会自动创建,如果存在则自动+1)
指定key的增长系数:incrby key increment
按照默认步长进行递减:decr key
按照指定步长进行递减:decrby key decrement
向尾部追加值。如果键不存在则创建该键,其值为写的value,即相当于SET key value。返回值是追加后字符串的总长度:APPEND key value
返回数据的长度,如果键不存在则返回0。注意,如果键值为空串,返回也是0:STRLEN key
同时设置多个键值:MSET key value [key value …]
同时获取多个键值:MGET key [key …]
java中String类型操作实践:
/**
* 将对象转换为字符串,然后以字符串类型的方式存储到redis,
* 这种的的最大缺陷:修改对象数据不方便
*/
@Test
public void testStringJsonOper(){
//1.建立连接
Jedis jedis=new Jedis("192.168.126.129",6379);
//2.将对象转换为json字符串
Map<String,Object> map=new HashMap<>();
map.put("id", "101");
map.put("name","tony");
Gson gson=new Gson();//Google公司提供
String jsonStr=gson.toJson(map);//将map转换为json串
System.out.println("jsonStr="+jsonStr);
//3.将json字符串存储到redis
jedis.set("member", jsonStr);
//4.取出member对象的值
String member = jedis.get("member");
System.out.println("redis.member="+member);
//5.将json字符串转换为Map对象
map=gson.fromJson(member, Map.class);
System.out.println(map);
//6.释放资源
jedis.close();
}
/**
* 基于junit+jedis对redis中的string类型进行测试
*/
@Test
public void testStringOper() throws InterruptedException {
//1.建立链接
Jedis jedis=new Jedis("192.168.126.129",6379);
//2.向redis中存储数据
jedis.set("id", "1");
jedis.set("name", "Tony");
jedis.set("token", UUID.randomUUID().toString());
jedis.expire("token", 2);
//3.更新redis中指定数据
jedis.set("id", "100");
jedis.incr("id");
jedis.incrBy("id", 2);
jedis.decr("id");
//4.删除redis中指定数据
jedis.del("name");
//5.查看redis中的数据
String id = jedis.get("id");
String token=jedis.get("token");
Long tokenStrLen=jedis.strlen("token");
String name=jedis.get("name");
System.out.println("id="+id);
System.out.println("name="+name);
System.out.println("token="+token);
System.out.println("token.length="+tokenStrLen);
//Thread.sleep(2000);
TimeUnit.SECONDS.sleep(2);
token=jedis.get("token");
System.out.println("token="+token);
//6.释放资源
jedis.close();
}
Hash类型应用实践
Redis散列类型相当于Java中的HashMap,实现原理跟HashMap一致,一般用于存储对象信息,存储了字段(field)和字段值的映射,一个散列类型可以包含最多232-1个字段。
1.存储/获取:(hset命令不区分插入和更新操作,当执行插入操作时hset命令返回1,当执行更新操作时返回0)
hset key field value
hget key field
hmset key field value [field value....]
hmget key field value [field value....]
hgetall key
2.自增(Hash类型中没有自减命令)
hincrby key field -1/+1
3.判断属性是否存在:(返回值为1则存在,返回值为2则不存在)
hexists key field
4.删除属性:hdel key field
5.只获取字段名hkeys:hkeys key
6.只获取字段值hvals: hvals key
List类型实践
Redis的list类型相当于java中的LinkedList,其原理就就是一个双向链表。支持正向、反向查找和遍历等操作,插入删除速度比较快。经常用于实现热销榜,最新评论等的设计
1.在key对应list的头部添加字符串元素:lpush mylist "xxx"
2.返回列表中指定区间内的元素:lrange mylist 0 -1 (Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推)
3.在key对应list的尾部添加字符串元素:rpush mylist "xxx"
4.删除:del mylist
5.在key对应list的特定位置之前或之后添加字符串元素:linsert mylist3 "xxx" "hello"
6.设置list中指定下标的元素值(一般用于修改操作):lset list3 0 "one"
7.从key对应list中删除count个和value相同的元素,
count>0时,按从头到尾的顺序删除:lrem mylist3 +2 "hello"
count<0时,按从尾到头的顺序删除:lrem mylist3 -2 "hello"
count=0时,删除全部
8.保留指定key 的值范围内的数据:ltrim mylist3 1 -1
9.从list的头部删除元素,并返回删除元素:lpop mylist3
10.从list的尾部删除元素,并返回删除元素:rpop mylist3
11.返回key对应list的长度:llen mylist3
12.返回名称为key的list中index位置的元素:lindex mylist 1[2,3...]
Set类型应用实践
Redis的Set类似Java中的HashSet,是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
1.添加元素,重复元素添加失败,返回0:sadd name1 tony
2.获取内容:smembers name1
3.移除并返回集合中的一个随机元素:spop name1
4.获取成员个数:scard name1
5.移动一个元素到另外一个集合:smove name1 name2 tony
6.并集:sunion name1 name2