redis基本操作

redis 基本操作

redis是单线程的,是基于内存存储,cpu不是redis的性能瓶颈,redis的性能瓶颈依赖机器的内存和网络带宽

redis为什么单线程还那么快?

1、误区1:高性能的服务器一定是多线程的?

2、误区2:多线程(CPU上下文需要切换需要时间)一定比单线程效率高!

核心:redis是将所有数据全部放在内存中,多线程操作 CPU上下文需要切换需要时间,对于内存系统来说,没有上下文切换效率就是最高的,多次读写都是在一个cpu上的,所以说reids单线程操作就是最佳方案

设置redis密码
配置文件:requirepass 123456

选择数据库
127.0.0.1:6379> select 15

查看当前数据库的 key 的数量
127.0.0.1:6379[15]> dbsize

获取当前数据库的所有key
127.0.0.1:6379> keys *

清空当前数据库
127.0.0.1:6379> flushdb

清空所有数据库
127.0.0.1:6379[1]> flushall

五大数据类型
redis-key
127.0.0.1:6379> clear # 清屏
127.0.0.1:6379> keys * # 获取所有key
(empty array)
127.0.0.1:6379> set name zhangsan # 设置key value
OK
127.0.0.1:6379> get name # 获取key 对应的value值
“zhangsan”
127.0.0.1:6379> EXPIRE name 10 # 设置key 对应的失效时间 单位秒
(integer) 1
127.0.0.1:6379> ttl name # 查看key 对应的失效剩余时间
(integer) 5
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> EXISTS name # 查看key 对应的失效剩余时间
(integer) 0
127.0.0.1:6379> set name aaaa
OK
127.0.0.1:6379> set sex 1
OK
127.0.0.1:6379> type name # 查看key 的类型
string
127.0.0.1:6379> type sex
string

String
127.0.0.1:6379> get name
“aaaa”
127.0.0.1:6379> APPEND name bbbbbbb # 追加字符串,如果key不存在,则相当于 set key value
(integer) 11
127.0.0.1:6379> STRLEN name # 获取字符串长度
(integer) 11
127.0.0.1:6379> get name
“aaaabbbbbbb”
127.0.0.1:6379> set number 1
OK
127.0.0.1:6379> INCR number # 自增1
(integer) 2
127.0.0.1:6379> DECR number # 自减1
(integer) 1
127.0.0.1:6379> DECR number
(integer) 0
127.0.0.1:6379> DECR number
(integer) -1
127.0.0.1:6379> DECR number
(integer) -2
127.0.0.1:6379> INCRBY number 10 # 自增 指定增量
(integer) 8
127.0.0.1:6379> DECRBY number 5 # 自减 指定减量
(integer) 3

字符串范围

127.0.0.1:6379> set test 0123456789
OK
127.0.0.1:6379> get test
“0123456789”
127.0.0.1:6379> GETRANGE test 0 4 # 获取下表0-4的字符串信息 (包头包尾)
“01234”
127.0.0.1:6379> GETRANGE test 0 -1 # 获取全部字符串信息
“0123456789”

setex( set with expire) 设置过期时间

setnx( set not exist) 不存在则设置(在分布式锁中会常常使用)

127.0.0.1:6379> SETEX key1 5 aaaaaa
OK
127.0.0.1:6379> get key1
“aaaaaa”
127.0.0.1:6379> ttl key1
(integer) -2
127.0.0.1:6379>
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> SETNX key2 1111111
(integer) 1
127.0.0.1:6379> get key2
“1111111”
127.0.0.1:6379> SETNX key2 222222222222
(integer) 0
127.0.0.1:6379> get key2
“1111111”

LIST
127.0.0.1:6379> LPUSH listkey a b c # 往列表头部依次加入数据
(integer) 3
127.0.0.1:6379> LRANGE listkey 0 -1 # 查询列表数据

  1. “c”
  2. “b”
  3. “a”
    127.0.0.1:6379> RPUSH listkey d e # 往列表尾部依次加入数据
    (integer) 5
    127.0.0.1:6379> LRANGE listkey 0 -1 # 查询列表数据
  4. “c”
  5. “b”
  6. “a”
  7. “d”
  8. “e”
    127.0.0.1:6379> LPOP listkey 2 # 从list头部弹出 2个元素
  9. “c”
  10. “b”
    127.0.0.1:6379> LRANGE listkey 0 -1
  11. “a”
  12. “d”
  13. “e”
    127.0.0.1:6379> RPOP listkey # 从list尾部弹出元素 默认是一个
    “e”
    127.0.0.1:6379> LRANGE listkey 0 -1
  14. “a”
  15. “d”
    127.0.0.1:6379> LINDEX listkey 0 # 获取下表0 的list具体值
    “a”

127.0.0.1:6379> LRANGE listkey 0 -1

  1. “d”
  2. “c”
  3. “a”
  4. “a”
  5. “d”
    127.0.0.1:6379> LRANGE listkey 0 -1
  6. “d”
  7. “c”
  8. “a”
  9. “a”
  10. “d”
    127.0.0.1:6379> LREM listkey 2 d # 移除list集合指定个数的value值,精确匹配
    (integer) 2
    127.0.0.1:6379> LRANGE listkey 0 -1
  11. “c”
  12. “a”
  13. “a”
    127.0.0.1:6379> LREM listkey 10 a
    (integer) 2
    127.0.0.1:6379> LRANGE listkey 0 -1
  14. “c”

127.0.0.1:6379> LRANGE list 0 -1

  1. “key”
  2. “a”
  3. “b”
  4. “c”
    127.0.0.1:6379> LTRIM list 0 1 # 截取list集合,通过下标,list已被改变
    OK
    127.0.0.1:6379> LRANGE list 0 -1
  5. “key”
  6. “a”

127.0.0.1:6379> LRANGE list 0 -1

  1. “key”
  2. “a”
  3. “b”
    127.0.0.1:6379> RPOPLPUSH list listkey # 移除列表的最后一个元素,将他移动到新的列表里
    “b”
    127.0.0.1:6379> LRANGE list 0 -1
  4. “key”
  5. “a”
    127.0.0.1:6379> LRANGE listkey 0 -1
  6. “b”
  7. “c”

lset 将列表中指定下标的值替换成另外一个值,更新操作 list不存在会报错

exists list 判断list是否存在

linsert 将某个元素插到list某个元素的前面或后面

set
差集
SDIFF key [key …] 获取队列不存在的元素 返回一个集合与给定集合的差集的元素.

key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SDIFF key1 key2 key3 = {b,d}

交集
SINTER key [key …] 返回指定所有的集合的成员的交集

key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SINTER key1 key2 key3 = {c}

并集
SUNION key [key …] 返回给定的多个集合的并集中的所有成员.

key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SUNION key1 key2 key3 = {a,b,c,d,e}

hash(哈希)
map集合,key-value ,value是一个map集合

zset(有序集合)
事务
redis事务本质就是一组命令的集合,一个事务里的所有命令都被序列化,一次性、顺序性、排他性

redis单条命令是原子性的,但是事务是不保证原子性的

编译异常(代码有问题,命令有错),事务中所有的命令都不会被执行

运行时异常(1/0),如果事务队列中语法没有错,那么执行命令的时候,其他命令可以正常执行,正常保存

redis 的事务:

开启事务
命令入队
执行事务
127.0.0.1:6379> MULTI #开启事务
OK
127.0.0.1:6379(TX)> set k1 aaa #命令入队
QUEUED
127.0.0.1:6379(TX)> set k2 bbb #命令入队
QUEUED
127.0.0.1:6379(TX)> get k2 #命令入队
QUEUED
127.0.0.1:6379(TX)> set k3 333 #命令入队
QUEUED
127.0.0.1:6379(TX)> exec #执行事务

  1. OK
  2. OK
  3. “bbb”
  4. OK

放弃事务

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k4 aaaa
QUEUED
127.0.0.1:6379(TX)> set k5 bbbb
QUEUED
127.0.0.1:6379(TX)> DISCARD # 放弃事务
OK
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> get k5
(nil)

1
2
3
4
5
6
7
8
9
10
11
12
13
乐观锁
127.0.0.1:6379> set incount 100
OK
127.0.0.1:6379> set outcount 0
OK
127.0.0.1:6379> WATCH incount #开启锁
OK
127.0.0.1:6379> MULTI #开始事务
OK
127.0.0.1:6379(TX)> INCRBY incount -30
QUEUED
127.0.0.1:6379(TX)> INCRBY outcount 30
QUEUED
127.0.0.1:6379(TX)> EXEC #执行事务

  1. (integer) 70
  2. (integer) 30
    127.0.0.1:6379> UNWATCH #释放锁
    OK
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值