Mysql
in、on、exist
- 使用 ON 的例子(表连接):
假设有两个表 学生 和 课程,它们分别包含学生信息和课程信息。我们可以使用 INNER JOIN 来连接这两个表,通过学生ID关联它们。
SELECT 学生.姓名, 课程.课程名
FROM 学生
INNER JOIN 选课 ON 学生.学生ID = 选课.学生ID
INNER JOIN 课程 ON 选课.课程ID = 课程.课程ID;
在这个例子中,ON 子句用于指定两个表之间的连接条件。
- 使用 IN 的例子:
假设有一个表 成绩,我们想要查询所有得到 A 等级的学生。
SELECT 姓名
FROM 学生
WHERE 学生ID IN (SELECT 学生ID FROM 成绩 WHERE 成绩 = 'A');
在这个例子中,IN 子句用于过滤符合条件的学生ID。
- 使用 EXISTS 的例子: 检测行的存在
假设我们想要查询至少选修了一门课程的学生。
SELECT 姓名
FROM 学生
WHERE EXISTS (SELECT 1 FROM 选课 WHERE 学生.学生ID = 选课.学生ID);
在这个例子中,EXISTS 子句用于检查是否存在符合条件的子查询结果,如果存在,就返回相应的学生记录。
Redis
基本操作
登录Redis
redis-cli -h redis-cnlfcw3rnt989pn1a.redis.ivolces.com -p 6379
检查连通性
ping
切换到指定数据库
select index
获取服务器信息
info
keys指令
# 查找所有以 "user" 开头的键
KEYS user*# 查找所有以 "user" 结尾的键
KEYS *user# 查找所有包含 "account" 的键
KEYS *account*# 查找所有以 "user" 开头且后面只有一个字符的键
KEYS user?# 查找所有以 "user" 开头,接着是一个数字的键
KEYS user[0-9]
KEYS 命令是阻塞的,执行时可能会导致性能问题,尤其是在大规模键空间的情况下。在生产环境中,可以考虑使用更高效的命令,如 SCAN。
在 Redis 4.0 之后,SCAN 命令被引入,它提供了一种更安全和高效的方式来遍历键空间。使用 SCAN 可以避免 KEYS命令可能导致的阻塞和性能问题。
# 示例:使用 SCAN 替代 KEYS
SCAN 0 MATCH user*
问题:假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将
它们全部找出来? 如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会有什么问题?
答:①使用 keys 指令可以扫出指定模式的 key 列表。
②redis 的单线程的。keys 指令会 导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢 复。这个时候可以使用 scan 指令,scan 指令可以无阻塞的提取出指定模式的key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys 指令长。
键操作
设置指定key的值
set key value
获取指定 key 的值
get key
检查 key 是否存在
exists key
获取 key 的剩余过期时间
ttl key
字符串操作
在指定 key 的值末尾追加字符串
append key value
获取指定 key 的字符串长度
strlen key
1、展示如何在一个事务中执行两个 SET 指令:
MULTI # 开始事务
SET mykey value1 # 执行第一个 SET 操作
SET mykey2 value2 # 执行第二个 SET 操作
EXEC # 提交事务