redis基础操作

1、使用入门:
1)获取匹配规则的键名列表
keys pattern 【?任一字符 * 任意字符 []区间】匹配
keys n?me
加粗样式
2)判断一个键是否存在 exists key 存在返回1 否则返回0
在这里插入图片描述

3)type key 获取键值数据类型
127.0.0.1:6379> type name
string
127.0.0.1:6379> ```

2、字符类型使用
默认字符类型key 的最大存储容量为512M
set key value 设置键值
get key 获取键的值
incr key 对指定键的值进行原子递增 用途 :和过期时间配合使用实现访问次数限制、短信发送次数限制等
incrby key increament 对指定键的值增加 指定值
decr key 递减
decrby key value
append key value dui指定的key 追加值
strlen key 获得指定key值长度
mget key1 key2 key3… 同时获得多个key的value 减少网络传输
mset key value key value … 同时设置多个键的值
setnx key value 设置如果键不存在则键key 的值为value 并返回1 否则设置失败并返回0 用于实现分布式锁

key 设置规则:对象类型:对象id:对象属性:对象子属性
测试实例如下

127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> set age 19
OK
127.0.0.1:6379> incr age
(integer) 20
127.0.0.1:6379> get age 
"20"
127.0.0.1:6379> incr hello
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incrby age 5
(integer) 25
127.0.0.1:6379> decr age
(integer) 24
127.0.0.1:6379> decrby age 2
(integer) 22
127.0.0.1:6379> strlen age
(integer) 2
127.0.0.1:6379> mset user1name zhangsan user1age 19
OK
127.0.0.1:6379> mget user1name user1age
1) "zhangsan"
2) "19"

3、散列类型使用
hash key value 类型,redis中散列类型不支持数据类型的嵌套 ,比较适合存储对象
person{ age: sex: name:}
hset person1 age 10 设置key 的属性和值
hget person1 age 获取key的属性值

hmset person1 age 10 name zhang 同时设置多个值
hmget person1 age name 同时获取多个值

hgetall person1 同时获取所有 key 和value
hexists person1 age 判断字段是否存在 存在返回 1 否则返回0
hsetnx person1 name lisi 为 对象设置属性 如果属性已经存在则设置不成功并返回0 否则设置成功并返回1
hincrby person1 age 5 对 对象person1的键age值 17 增加指定数量 5
hdel person1 age name 可以删除多个键 返回 实际删除的键水量

127.0.0.1:6379> hset person1 name zhangsna
(integer) 1
127.0.0.1:6379> hmset person1 age 12 sex 1
OK
127.0.0.1:6379> hgetall
(error) ERR wrong number of arguments for 'hgetall' command
127.0.0.1:6379> hgetall person1
1) "name"
2) "zhangsna"
3) "age"
4) "12"
5) "sex"
6) "1"
127.0.0.1:6379> hget person1 name
"zhangsna"
127.0.0.1:6379> hexists person1 weight
(integer) 0
127.0.0.1:6379> hsetnx person1 name lisi
(integer) 0
127.0.0.1:6379> hget person1 name
"zhangsna"
127.0.0.1:6379> hincrby person1 age 5
(integer) 17
127.0.0.1:6379> hdel person1 sex
(integer) 1
127.0.0.1:6379> hgetall person1
1) "name"
2) "zhangsna"
3) "age"
4) "17"

4、列表类型使用
list 可以存储一个有序的字符串列表 ,可以用来实现分布式队列
lpush key value value… 左侧往key 中添加一个值 可以一次添加多个值 返回总个数
rpush key value value… 右侧往key 中添加一个值 可以一次添加多个值 返回总个数
rpop 从右侧数据弹出并返回弹出元素内容(元素会从列表中移除)
lpop 从左侧弹出数据 并返回弹出元素内容 可以实现序列(元素会从列表中移除)
lrange key start stop 获取一个范围的数据 如:lrang num 0 10 ( -1表示最右边的一个元素位置)

lrem key count value 删除 count个 值为 value 的元素
lset key index value 设置指定位置元素的值

127.0.0.1:6379> lpush numlist 1 2 3
(integer) 3
127.0.0.1:6379> lrange numlist 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> rpush numlist 4 5
(integer) 5
127.0.0.1:6379> lrange numlist 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
5) "5"
127.0.0.1:6379> rpop numlist 
"5"
127.0.0.1:6379> lpop numlist
"3"
127.0.0.1:6379> llen numlist
(integer) 3
127.0.0.1:6379> lrange numlist 0 -1
1) "2"
2) "1"
3) "4"
127.0.0.1:6379> lset numlist  1 23
OK
127.0.0.1:6379> lrange numlist 0 -1
1) "2"
2) "23"
3) "4"
127.0.0.1:6379> lpush 2
127.0.0.1:6379> lpush numlist 2
(integer) 4
127.0.0.1:6379> lpush numlist 23
(integer) 5
127.0.0.1:6379> lrange numlist 0 -1
1) "23"
2) "2"
3) "2"
4) "23"
5) "4"
127.0.0.1:6379> lrem numlist 1 23
(integer) 1
127.0.0.1:6379> lrange numlist 0 -1
1) "2"
2) "2"
3) "23"
4) "4"
127.0.0.1:6379> lpush numlist 23
(integer) 5
127.0.0.1:6379> lpush numlist 23
(integer) 6
127.0.0.1:6379> lpush numlist 23
(integer) 7
127.0.0.1:6379> lrem numlist 3 23
(integer) 3
127.0.0.1:6379> lrange numlist 0 -1
1) "2"
2) "2"
3) "23"
4) "4"

5、集合类型使用
集合和list 区别 集合中元素不能重复 而且无序
sadd key member memeber 集合key 中添加元素 可以添加多个 重复数据会忽略,返回本次添加成功元素的数量
srem key memebe … 删除元素可以是多个返回本次时机删除元素数量
smemebers key 获取所有元素
sdiff coll1 coll2 … 对第一个集合和后边集合执行差集
sunion coll1 coll2 对多个集合执行并集

127.0.0.1:6379> sadd stu zhangsan lisi
(integer) 2
127.0.0.1:6379> sadd gstu zhangsan  wnagwu
(integer) 2
127.0.0.1:6379> sadd bstu lisi haha
(integer) 2
127.0.0.1:6379> sadd bstu lisi haha dsdsdf
(integer) 1
127.0.0.1:6379> srem bstu dsdsdf
(integer) 1
127.0.0.1:6379> srem bstu dsdsdf hah
(integer) 0
127.0.0.1:6379> srem bstu dsdsdf haha
(integer) 1
127.0.0.1:6379> smembers bstu
1) "lisi"
127.0.0.1:6379> sdiff stu gstu bstu
(empty list or set)
127.0.0.1:6379> sdiff stu gstu 
1) "lisi"
127.0.0.1:6379> sadd stu ddd
(integer) 1
127.0.0.1:6379> sadd stu ddd dfsfs
(integer) 1
127.0.0.1:6379> sdiff stu gstu bstu
1) "ddd"
2) "dfsfs"
127.0.0.1:6379> sunion stu gstr
1) "zhangsan"
2) "lisi"
3) "ddd"
4) "dfsfs"
127.0.0.1:6379> sunion stu gstu
1) "ddd"
2) "dfsfs"
3) "wnagwu"
4) "lisi"
5) "zhangsan"
127.0.0.1:6379> sunion stu gstu bstu
1) "dfsfs"
2) "ddd"
3) "wnagwu"
4) "lisi"
5) "zhangsan"
127.0.0.1:6379> 

6、有序集合使用
zadd key score member score memeber 添加元素
zrange key 0 3 [withscores] 获取范围内的元素
如果两个元素的score 相同 name根据 0<9<a<z<A<Z进行排序显示
实现网站访问前十名:

127.0.0.1:6379> zadd teacher 10 zhang 9 li 10 han 20 fan 50 wang
(integer) 5
127.0.0.1:6379> zrange 0 -1
(error) ERR wrong number of arguments for 'zrange' command
127.0.0.1:6379> zrange teacher 0 -1
1) "li"
2) "han"
3) "zhang"
4) "fan"
5) "wang"
127.0.0.1:6379> zrange teacher 0 -1 withscores
 1) "li"
 2) "9"
 3) "han"
 4) "10"
 5) "zhang"
 6) "10"
 7) "fan"
 8) "20"
 9) "wang"
10) "50"
127.0.0.1:6379>

7、redis 事物
multi 开启事务
exec 执行事务
事务内的命令统一提交,如果异常则回滚。

127.0.0.1:6379> multi 
OK
127.0.0.1:6379> set name zhangsna
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> 

但是有一种情况有异常也无法回滚,如下:

OK
127.0.0.1:6379> set name3 lisi 
QUEUED
127.0.0.1:6379> lpush name3 zhang
QUEUED
127.0.0.1:6379> set name3 wang
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get name3
"wang"
127.0.0.1:6379> 


8 过期时间
set demo value
expire demo 10 demo 键 10秒后过期
ttl demo 获得当前key 过期时间

127.0.0.1:6379> set name zhangsan 
OK
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> ttl name
(integer) 8
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> 

9发布订阅
publish channel message 发布消息
subscribe channel 订阅 频道 channel

客户端1 运行 subscribe queue1 queue2订阅两个频道
客户端2 运行 publish queue1 hello 后客户端1收到消息如下
客户端1:

127.0.0.1:6379> subscribe queue1 queue2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "queue1"
3) (integer) 1
1) "subscribe"
2) "queue2"
3) (integer) 2
1) "message"
2) "queue1"
3) "hello"
1) "message"
2) "queue1"
3) "hello"

客户端2:

127.0.0.1:6379> publish queue2 hello
(integer) 1

10、redis实现分布式锁
setnx 命令
简易实现代码如下:


public class RedisManager {
	private static JedisPool jedisPool;
	static{
		JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
		jedisPoolConfig.setMaxTotal(20);
		jedisPoolConfig.setMaxIdle(10);
		jedisPool = new JedisPool(jedisPoolConfig,"192.168.159.10" ,6379);
		
	}
	public static Jedis getJedis() throws Exception {
		if(null!=jedisPool){
			return jedisPool.getResource();
		}
		throw new Exception("连接池未初始化");
	}
	
	public static void main(String[] args) throws Exception{
		System.out.println(getJedis());
	}
}
public class DistributeLock {
	public static String getLock(String key,int timeout) {
		try {
			Jedis jedis =RedisManager.getJedis();
			String value=UUID.randomUUID().toString();
			long curTime = new Date().getTime();
			while((new Date().getTime()-curTime)<timeout){
				Long res = jedis.setnx(key, value);
				if(res==1){//设置成功则返回 value
					jedis.expire(key,timeout);//为锁设置超时时间
					return value;
				}
				//容错代码 如果 某个现成获取了 设置了 key值还没有设置过期时间 就宕机了 这里补充设置
				if(jedis.ttl(key)==-1)
					jedis.expire(key,timeout);
				
				Thread.sleep(500);//阻塞现成 每 500ms尝试一次
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 释放锁
	 * @param key
	 * @param value
	 * @throws Exception 
	 */
	public boolean releaseLock(String key,String value) {
		Jedis jedis;
		try {
			jedis = RedisManager.getJedis();
			while(true){
				jedis.watch(key);//可以监视一个key 如果这个key 被修改了 那么后边的事务代码不会执行
				String val=jedis.get(key);
				if(value.equals(val)){//值没有变 则删除key
					Transaction trans = jedis.multi();
					jedis.del(key);
					List<Object> res=trans.exec();
					if(res==null){
						continue;//释放失败重新释放
					}
					return true;
				}
				jedis.unwatch();
				break;
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
		
	}
	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String lockId = DistributeLock.getLock("dao", 1000);
		if(null!=lockId)
			System.out.println("获取锁成功");
		
		String lockId2 = DistributeLock.getLock("dao", 1000);
		if(null!=lockId2)
			System.out.println("获取锁成功");
		else
			System.out.println("获取锁失败");

	}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: Redis数据库是一个内存数据库,通过key-value键值对的方式进行数据存储。它的优点包括访问速度快、适用于缓存系统和存储大量活跃数据,可以提高网站的响应速度。\[1\]在Java中,有两个比较出名的连接Redis的驱动包,分别是Jedis和Redisson,我们可以使用Jedis来进行程序操作Redis。\[3\]以下是一些基本的Redis操作方法: - 使用`new Jedis(host, port)`创建Jedis对象,其中host是Redis服务器地址,port是Redis服务端口。 - 使用`set(key, value)`方法设置字符串类型的数据。 - 使用`get(key)`方法获取字符串类型的数据。 - 使用`hset(key, field, value)`方法设置哈希类型的数据。 - 使用`hget(key, field)`方法获取哈希类型的数据。 - 使用`lpush(key, values)`方法设置列表类型的数据。 - 使用`lpop(key)`方法从列表左侧弹出元素。 - 使用`rpop(key)`方法从列表右侧弹出元素。 - 使用`del(key)`方法删除指定的key。\[3\] #### 引用[.reference_title] - *1* [redis基本操作](https://blog.csdn.net/m0_50782114/article/details/128119748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Redis基本使用!](https://blog.csdn.net/weixin_50769390/article/details/127134134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值