Redis基础

Redis

Redis是一个开源的BSD许可的,内存中的数据结构存储系统,它可以用做数据库、缓存和消息中间件。

Redis测试

redis-cli -p 6379
ping

redis-benchmark 是Redis官方自带的性能测试工具。

Redis 是单线程的,Redis是基于内存操作的,CPU不是Redis的性能瓶颈,Redis的瓶颈是机器的内存和网络带宽。

Redis 是C语言写的,官方提供的数据为100000+的QPS,不比同样使用的Memecache差
为什么单线程还这么快
误区1:高性能的服务器一定是多线程的
误区2:多线程一定比单线程高,多线程会上下文切换,也会消耗资源和时间
核心:Redis是将所有的数据全部放在内存中的,所以说使用单线程操作就是最高的,对于内存系统来说,如果没有上下文切换效率就是最高的。多次读写都是在一个CPU上的,在内存的情况下,这就是最佳的方案。

Redis常用命令

Redis 不区分大小写命令

config set requirepass "your password" # 通过命令修改密码
save
# Redis 默认有16个数据库,默认使用第0个数据库
# 清除当前数据库
flushdb
# 清除全部数据库的内容
FLUSHALL
# 选择数据库2
select 2
# 查看数据库中数据大小
DBSIZE
# 查看数据库中所有的键值
keys *

Redis 五大数据类型

Redis-key

# 设置缓存
set name redis
# 查看所有的key
keys *
# 判断当前key是否存在
EXISTS name
# 移除当前key
move name
# 设置过期时间
EXPIRE name 10
# 查询当前key的剩余时间
ttl name
# 查看当前key的类型
type name

String

# 设置值
set name v1
# 获得值
get name
# 获取所有的key
keys *
# 判断某一个key是否存在
EXISTS name
# 字符串后追加字符,如果当前key不存在,就相当于set key
APPEND name "hello"
# 获取字符串的长度
STRLEN name

i++ 操作

set views 0
get views
# +1操作
incr views
# -1操作
decr views
# 设置步长为10 +10
INCRBY views 10
# 设置步长为10 -10
DECRBY views 10
# 字符串范围
set key1 "hello, word!"
# 字符截取
GETRANGE key1 0 3 # hell 截取下标为0,1,2,3的字符[0,3]
GETRANGE key1 0 -1 # 查看全部的字符串 等于与get key1
# 替换指定位置的字符串
SETRANGE key1 1 oo # hoollo, word!"
# setex(set with expire) # 设置过期时间
setex key3 30 "hello"
# setnx(set if not exist) # 如果不存在,在分布式锁中常常使用
setnx myKey "redis" # 如果mykey不存在,则创建mykey,如果存在,则创建失败
setnx myKey "hello" # 输出redis
# 同时设置多个值
mset k1 v1 k2 v2 k3 v3
# 同时获取多个值
mget k1 k2 k3
# 重要,原子操作,要么一起成功,要么一起失败
msetnx k1 v1 k4 v4 #如果不存在则创建,原子性操作,k4也不会创建
# 对象
# 设置一个user:1 对象,值为json字符串
set user:1 {name:zhangsan, age:3}
# 巧妙设计user
mset user:1:name zhangsan user:1:age 2
mget user:1:name user:1:age
# 组合命令
# 如果不存在值则返回nil, 如果存在值则获取原来的值,并设置新的值
getset db redis #(nil)
get db # "redis"
getset db mongodb # "redis"
get db # "mongodb"

String使用场景
value 除了是字符串也可以是数字

  • 计数器
  • 统计多单位的数量
  • 对象缓存存储

List

在Redis里面可以使用list当栈或队列,所有的list命令都是用L开头

# 将一个值或多个值插入列表的头部,左边(LPUSH)
 LPUSH list one
 LPUSH list two
 LPUSH list three
 # 获取list的值
 LRANGE list 0 -1 # three, two, one 顺序
 LRANGE list 0 1 # three, two
# 将一个值或多个值插入到列表的尾部,右边(RPUSH)
RPUSH list right
LRANGE list 0 -1 # three, two, one, right

# 移除命令
# 移除列表的第一个元素(从左边)
LPOP list # three
# 移除列表的最后一个元素(从右边)
RPOP list # right
LRANGE list 0 -1 # two, one

# 通过下标获得list的某一个元素
LINDEX list 1 # one
LINDEX list 0 # two

# 
# 返回列表的长度
LLEN list
# 移除指定的个数的指定值
LREM list 1 one # 移除列表里面1个one值
LREM list 2 one # 移除列表里面2个one值

#trim Java中去掉字符串两头空格函数,Redis截断操作
RPUSH mylist "hello"
RPUSH mylist "hello1"
RPUSH mylist "hello2"
RPUSH mylist "hello3"
# 通过下标指定截取长度,会改变原有list,只留下截断的list
LTRIM mylist 1 2 # hello1,hello2

# 移除列表最后一个元素,并添加新的列表中
# RPOPLPUSH
RPUSH mylist "hello1"
RPUSH mylist "hello2"
RPUSH mylist "hello3"
RPOPLPUSH mylist myotherlist
LRANGE mylist 0 -1 #hello, hello1
LRANGE myotherlist # hello2

# 判断列表是否存在
EXISTS list
LPUSH list value1
LRANGE list 0 0 # value1
# 将列表中指定下标的值替换为另外一个值,相当于更新操作,如果不存在列表,会报错,如果存在当前下标的值,则会更新值,如果不存在则会报错
LSET list 0 item
LRANGE list 0 0 # item

# 向某一个值得前面或后面添加一个值
RPUSH list "hello"
RPUSH list "world"
LINSERT list before "world" "other"
LRANGE list 0 -1 # hello, other, world
LINSERT list after "world" "other"
LRANGE list 0 -1 # hello, other, world, new

小结
list 实际上是个链表,before node after, left, right 都可以插入值
如果key不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在
在两边插入或者改动值,效率最高,移除元素,效率相对会低
list 当栈或队列都行

Sets

无序集合类型,Set集合中的值不能重复,S开头

# Set集合中添加元素
SADD myset "hello"
SADD myset "world"
# 查看集合所有元素
SMEMBERS myset
# 判断某一个元素是不是在Set集合中
SISMEMBER myset hello
# 获取Set集合中的个数
SCARD myset
# 移除集合中的指定元素
SREM myset "hello"
# 随机抽出一个元素
SRANDMEMBER myset
# 随机抽选出指定个数的元素
SRANDMEMBER myset 2
# 随机删除元素
SPOP myset
# 将一个指定的值,移动到其他集合
SMOVE myset myset2 "hello"

数学集合类操作

# 差集
SDIFF myset myset2
# 交集
SINTER myset myset2
# 并集
SUNION myset myset2

Hash

key-map集合,H开头,本质和String类型没有区别

#set 一个字段值
hset myhash name zhangsan
#get一个字段值
hget myhash name
# set多个key-value
hset myhash name zhangsan age 12
# 获取多个字段值
hget myhash name age
# 获取所有键值对
hgetall myhash
# 删除指定的key字段,对应的value也就消失了
hdel myhash age
# 获取hash长度
hlen myhash
# 判断某个字段是否存在
HEXISTS myhash name
# 只获得所有的字段
hkeys myhash
# 只获得所有的值
hval myhash
# +2
HINCRBY myhash age 2
# 如果不存在则可以设置,如果存在则不能设置(分布式锁)
HSETNX myhash name zhangsan

Hash尤其可以是用户信息保存,和经常变动的信息,更适合对象的存储
String 更适合字符串存储

Sorted Sets(Zset)

有序集合,在set的基础上加了一个值

# 加入一个排序的数字
zadd myset 1 one
zadd myset 2 two 3 three
# 查看所有元素
ZRANGE myset 0 -1
# 排序 无限小和无限大,显示全部元素,默认递增
ZRANGEBYSCORE myset -inf +inf
# 排序 带分数值
ZRANGEBYSCORE myset -inf +inf withscore
# 排序 从大到小排序
ZREVRANGE myset 0 -1
# 移除集合中的指定元素
ZREM myset name
# 获取有序集合中的个数
ZCARD myset
# 统计两个区间的值个数
ZCOUNT myset 1 2

案例:
存储班级成绩,工资表排序,排行榜,去top10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值