redis基础知识

redis使用命令

redis测试连接 :ping 显示pong代表成功

存k-v:set name sun

取v:get name

windows下使用确实简单,但推荐使用linux

==============================================================

Linux下操作

将Redis安装包放到一个目录下,解压Redis的安装包!程序一般放到/opt

移动到opt目录下:mv redis安装包 /opt

解压该压缩包:tar zxvf redis安装包

安装c++:yum install gcc-c++

配置:make

redis默认安装路径:/usr/local/bin

将配置文件复制到安装路径下:cp /opt/redis-5.0.7/config 你的目录

redis默认不是后台启动,修改配置文件
vim redis.conf 修改里面的demonsize no 为 yes

启动redis服务
redis-server sconfig/redis.config

查看是否启动成功
redis-cli -p 6379

新打开连接,查看进程:
ps -ef|grep redis

关闭redis服务
shutdown
exit

redis-benchmark:是一个压力测试工具
测试并发连接:100个并发 10000个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

切换数据库
select 0-15
数据库大小
dbsize
清除当前数据库
flushdb
清空所有数据库
flushall

redis是单线程的,redis是基于内存操作的,cpu不是redis的性能瓶颈
redis的瓶颈是根据机器的内存和网络的带宽,既然可以使用单线程,就使用了。

redis为什么使用单线程还这么快?
redis是使用C语言写的,官网提供的100000+的QPS,完全不比Memecache差
高性能的误区不一定是使用多线程
多线程(上下文切换)不一定比单线程效率高
核心:redis是将所有数据全部放到内存中的,所以说使用单线程去操作效率是最高的,多线程(cpu上下文切换:耗时的操作)对于内存系统来说,如果没有上下文切换效率就是最高的。

=========================================

是否存在k
exists name

删除一个key
move name 1

设置过期时间(name 的过期时间有10s)
expire name 10

查看还有多少时间过期
ttl name

查看类型
type name

=======================================

常见的五大数据类型:

===========================================
String

追加:
append key1 hello (如果当前key1不存在,就相当于set key1)

获取长度
strlen key1

+1操作
incr views

-1操作
decr views

+10操作
incrby views 10

-10操作
decrby views 10

字符串截取
getrange key1 0 3 (【0,3】)
getrange key1 0 -1(截取全部)

替换
setrange key1 1 bb(将key1从第一个位置起,换成bb)

设置过期时间
setex
setex key1 30 “hello”(设置key1的值为hello,过期时间是30s)

如果不存在再设置
setnx
setnx mykey “redis”(如果不存在就设置,否则就不创建这个)

批量设置值
mset k1 v1 k2 v2 k3 v3
get k1
get k2
get k3
批量获取值
mget k1 k2 k3

msetnx k1 v1 k4 v4(因为k1存在,所以创建失败,这是一个原子操作)

设置对象
(1)set user:1 {name:zhangsan, age:3}
(2) mset user:1:name zhangsan user:1:age 2

获取(2)对象
mget user:1:name user:1:age

先get然后set
getset

getset db redis (如果不存在值,则返回nil,然后设置db为redis)
get db (可以获得redis值)

getset db mongodb (获得这个值,然后设置新的值)
get db(获取到mongodb值)

List类型
lpush lrange rpush rrange lpop rpop lindex llen

lrem list 2 one(移除one并移除2个)
ltrim mylist 1 2(只要1 - 2 范围内的值,mylist被改变了)
rpoplpush mylist otherlist(从右边弹出一个值,复制到新的list-otherlist中)
exists list(查看是否存在)
lset mylist 0 item(mylist中第0个值换为item)
lset mylist 1 item(不存在1这个位置,会报错)
linsert mylist before/after “word” “other”(在word这个值前或后面插入一个other)

set 类型(无序不重复集合)
sadd myset “hello”(插入元素)
smember myset(查看元素)
sismember myset world(查看是否存在该元素)
scard myset (查看set集合元素个数)
srem myset hello(移除set集合中的指定元素)
srandmember myset(随机抽选出一个元素)
srandmember myset 2(随机抽选出两个个元素)
spop myset(随机删除set集合中的元素)
smove myset myset2 “sdajknasd”(将一个指定的 值移动到另一个指定的set集合)
sdiff set1 set2(差集)
sinter set1 set2(交集)
sunion set1 set2(并集)

================================================
hash集合(key - map)

和字符串差不多
hset myhash k1 v1
hmset myhash k1 v1 k2 v2
hget myhash k1
hmget myhash k1 k2
hgetall myhash
hdel myhash k1
hlen myhash
hexits myhash k1
hkeys myhash
hvals myhash
hincrby myhash k1 1
hdecrby myhash k1 3

===========================================
zset(有序集合)
zadd myzset 1 one
zadd myzset 2 two 3 three
zrange myzset 0 -1
zrem myzset xiaohong
zcard myset (获得元素个数)
zrangebyscore myzset -inf +inf withscores(带上score)
zrangebyscore myzset -inf +inf(从小到大吧)

场景:共同关注,
三大特殊类型:

geospatial 地理位置
朋友的定位、附近的人、打车距离计算

添加位置,不能超了,不能录入南极北极
geoadd
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian

获取
geopos
127.0.0.1:6379> geopos china:city beijing

    1. “116.39999896287918091”
    2. “39.90000009167092543”

获取北京到上海的距离
geodist
127.0.0.1:6379> geodist china:city beijing shanghai km
“1067.3788”

我附近的人以110 30 为中心半径在1000km内的城市
城市坐标必须加入
127.0.0.1:6379> georadius china:city 110 30 1000 km

  1. “chongqing”
  2. “xian”
  3. “shenzhen”
  4. “hangzhou”
    只显示一个
    127.0.0.1:6379> georadius china:city 110 30 500 km count 1
    带有精度维度,直线距离,筛选出1个城市
    127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1
    找出位于指定位置的周围元素
    127.0.0.1:6379> georadiusbymember china:city beijing 1000 km

geo底层实现是Zset,所以可以使用zset的命令
zrange zrem

Redis2.8.9版本就更新了Hyperloglog数据结构
基数统计算法(统计数字个数,去除不重复的)

优点:占用内存是固定的,2^64不同的元素的技术,只需要废12kb的内存,如果要从内存角度
来比较Hyperloglog首先

网页的UV(一个人访问一个网站多次,但是还是算作一个人)

传统的方式是使用set保存用户id然后统计
set中的元素数量

这个方式如果保存大量的用户id,就会比较麻烦

127.0.0.1:6379> clear
127.0.0.1:6379> pfadd mykey1 a b c d e f 创建第一组元素
(integer) 1
127.0.0.1:6379> pfcount mykey1 统计基数数量
(integer) 6
127.0.0.1:6379> pfadd mykey2 e f g h i j 创建第二组元素
(integer) 1
127.0.0.1:6379> pfcount mykey2 统计基数数量
(integer) 6
127.0.0.1:6379> pfmerge mykey mykey1 mykey2 合并
OK
127.0.0.1:6379> pfcount mykey 去除重复了
(integer) 10

如果允许容错,那么一定可以使用Hyperloglog
否则就使用set

Bitmaps
位存储
都是操作二进制位来进行记录,只有0和1

127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> getbit sign 1
(integer) 1
127.0.0.1:6379> getbit sign 2

事务
Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中会按照谁许执行
一次性、顺序性、排他性
Redis单条命令式保持原子性,但是事务不保证原子性

Redis事务没有隔离级别的概念
所有命令在事务中,并没有直接被执行,只有发起命令的时候才会执行!

redis事务:
开启事务
命令入队
执行事务

127.0.0.1:6379> multi 开启事务
OK
127.0.0.1:6379> set k1 v1 命令入队
QUEUED
127.0.0.1:6379> set k2 v2 命令入队
QUEUED
127.0.0.1:6379> get k1 命令入队
QUEUED
127.0.0.1:6379> set k3 v3 命令入队
QUEUED
127.0.0.1:6379> exec 执行

  1. OK
  2. OK
  3. “v1”
  4. OK
    127.0.0.1:6379>

放弃事务discard
事务队列中的命令都不会执行

事务中有命令出现编译时异常,其他命令不会执行
事务中有命令出现运行时异常,其他命令也会执行,

悲观锁和乐观锁

悲观锁:
很悲观,认为什么时候都会出问题,无论做什么都要加锁
乐观锁
很悲观,认为什么时候都不会出问题,所以不会加锁,在此期间是否有人修改过这个数据
获取version
更新的时候比较version

127.0.0.1:6379> set money 1000 money发生变化,到时下面事务失败

监视money在事务时是否变化,如果变化,就不执行事务中的命令
127.0.0.1:6379> watch money 监视money,相当于一个版本控制,实现了乐观锁
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby money 20
QUEUED
127.0.0.1:6379> exec 执行之前另外一个线程修改了money,所以失败
(nil)

如果事务执行失败就先解锁
unwatch解锁

========================================

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值