胜博发游戏官网redis 缓存策略

( 胜博发游戏官网 )

在使用redis缓存数据的过程中,设计缓存思路如下:
获取数据时,先从缓存中获取数据,如果获取到的数据为空,则查询数据库,然后先将查询到的数据缓存到redis,再返回数据
但现在有两个问题请教一下大家:

  1. 如果数据库中查询的结果为空,那么不会缓存数据,因此也无法从缓存中获取数据,那么每次获取数据时都会进行一个数据库查询,这个应该怎么优化?

  2. 数据进行更新时,缓存应该怎么处理?

对这两个问题我有一点不成熟的想法,现提出来恳请大家指点一下是否可行以及是否有更好的处理方式:

对于第一个问题,如果从数据库查询没有获取到数据,那么缓存一个固定的默认值(如字符串:’nodata’)表示没有数据,下次从缓存中获取数据时,得到这个固定表示没有数据的值时就直接返回空,而不用再次查询数据库

对于第二个问题,当前想法是,如果更新的数据是不是特别重要的话,那么将数据写入数据库后直接更新缓存中对应的数据,下次获取数据时不用查询数据库就能直接获取到最新的数据,但如果更新的数据是特别重要的(比如:金钱),那么将数据写入数据库后直接清除对应的缓存,下次再获取数据的时候就需要查询数据库获取最新的数据。

  1. 你需要一个方式(比如天然可空类型或者和类型)来区分这两个情况。比如有数据的时候里边存的是一个 JSON 化的列表 [{...}, {...}],那么没数据时自然存 [] 了。总之没有冲突就行。

  2. 缓存更新的套路 | 酷 壳 – CoolShell.cn

楼上说的很有道理。
你可以参考下文件缓存的思路,
thinkphp文件缓存采取的是serialize(valle)去保存数据,文件名作为key名。清除缓存,直接set(null)来实现。
缓存只是为了查询时候的方便,减少mysql的访问次数,至于缓存更新的问题得靠代码去实现。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机mysql limit之后想统计查询出来的条数的某个字段和?

( SBF胜博发娱乐老虎机 )

select uid,skip,time from attendance where uid = 8499 order by time limit 3

上面是查询的结果,我想把skip字段的结果加起来,怎么实现?sum试过了,是统计所有的,limit的不起作用

用子查询的方式来实现:

select uid, sum(skip) as sumskip, time from (select uid, skip, time from attendance where uid = 8499 order by time limit 3) as subt;

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

SBF胜博发娱乐老虎机博客文章标签表结构设计问题

( SBF胜博发娱乐老虎机 )

感觉segmentfault站点设计的标签还是很不错的,正在写一个博客平台,想做个文章标签,现在表设计如下:

文章表(articles)

id title tags
1 xxx 1,3,4
2 aaa 2,4
3 bbb 3,5

标签表(tags)

id name
1 php
2 javascript
3 mysql
4 css3
5 html5

假如信息结构如上面,那么怎么取出每篇文章的详细信息呢?上面的表设计可以实现吗?

我查了下本站的相关问题,有人说再加入第三章标签文章关联表,如下面

标签关联表(tag_links) tidtagsid,aid是文章articlesid

id tid aid
1 1 1
2 3 1
2 4 1

那么这个有怎么查出文章的详细信息呢?

一般的按照下面的方式来建表的,查询详细信息的话,你可以先根据文章的id文章表里面查文章的一些信息,然后再根据文章id去标签表和文章标签关联表join查询出,标签数据,最后把这两个数组合并下就好了。

有点小小的建议:你可以把文章表进行水平分割下,你可以把内容字段拿出来单独做一张表,用id进行关键,这样做在数据量很大的时候,效率比较好,

这些是我的个人看法,有不对的地方,还望大神们指点

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

SBF胜博发娱乐老虎机抽象类和接口?

( SBF胜博发娱乐老虎机 )

请问在什么情况下,将对象抽象为一个抽象类?在什么情况下,该将对象抽象为一个接口?我知道他们两个的区别,就是想知道在什么场景下该抽象为哪种?

比如说生物和人 此时生物可以当做接口,人当做实现生物的抽象类,男人女人作为具体实现类,为什么可以这样设计?因为生物是个非常非常抽象的概念,你很难抽象出它的具体行为(也就是具体的方法实现),此时可以当做接口,人为何可以作为抽象类,因为他可以有具体的行为动作实现,比如,摸爬滚走,但是可能男人女人的性征不一样,同时可能还有一些公有的行为 但是行为特征不一样 这可以当做抽象类的抽象方法,让子类实现。大概是这样。

比如你有好多个类似的对象(想了半天,用别的词不太合适),人也好,东西也好。他们的属性几乎都一样,你就可以把它们抽象成一个类。比如车类,有轮子、发动机、底盘、外壳等属性。new一个对象,来保存当前的属性,可能你要把这些属性保存到数据库,也可能要显示给用户,当前的对象就是起了个保存数据的作用。对象不仅仅能保存数据,还可以有自己的方法,比如发动车。点击某个按钮,调用当前对象的发动的方法。一般类的方法都会和数据的变化有关,我说的是一般,并不是所有。比如数据库连接类,就不会改变数据,只是起到一个连接数据库的作用。
接口一般来说是给外部调用的。你写了一系列的方法,最终能完成一个有用的动作。这一系列的方法最开始的地方就是接口,你可以这么理解。比如一个简单登陆界面,你输入用户名密码之后,点击确定就开始调用后台登录接口,把用户名密码传给服务器,服务器端接收需要一个方法,接收之后要对密码进行验证,又是一个方法。验证之后给客户端返回消息。登录成功或者失败,这一系列动作完成。当然这些你可以压到一个方法里完成,总之开始的地方就是接口。
以上说法比较直白,并不完全准确。

接口表示一个能力/行为。例如:人会跑,狗也会跑,就可以定义接口IRunable。 使用接口很好实现组件间解耦。
抽象类就是为了实现多态,使代码更方便扩展。

接口就好像是100% 纯天然的抽象类。

接口的话更偏向于为一群类定一个协议, 而抽象类的话已经向实现迈进了一步。

例如模板方法模式中就用到了抽象类,实现了一些通用的方法, 而将不同的方法延迟到子类再实现。

举个简单的例子,你现在想要抽象所有国家的人,那么你会想到抽象成一个接口,然后有个方法叫sayHello

public interface Human{
    
    String sayHello();
}

OK,现在每个实现了这个接口的对象只要实现sayHello方法,就表示了各个国家的人,他们拥有了不同的打招呼的的方式。

但是现在业务复杂起来了,你需要这些人还具备一些通用的能力,比如cry,walk,那么这个时候,你是不是应该考虑把Human抽象成为一个抽象类,像这样:

public abstract class Human{
    
    public abstract String sayHello();
    
    public String cry(){
        System.out.println("wu~wu~wu~wu~wu~");
    }
    
    public String walk(){
        System.out.println("左右左 左右左");
    }
}

总结一下,就是如果只有抽象的方法,那么就用接口,如果还有通用的具体方法实现,则用抽象类

参考:
The Java™ Tutorials :: Learngin The Java Language :: Interfaces and Inheritances :: Inheritances :: Abstract Methods and Classes :: Abstract Classes Compared to Interfaces

抽象类用于抽象事物,接口抽象行为

该类定义统一操作,为对象提供方法

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

胜博发游戏官网PHP,各位大牛怎么从数据里的手机号字段统计出来三大运营商的手机号数量

( 胜博发游戏官网 )

PHP,各位大牛怎么从数据里的手机号字段统计出来三大运营商的手机号数量

结合上面两位的回答就是你要的

使用正则表达式

首先你要知道三大运营商的号段,再进行分类,最后统计

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城MySQL,如何用一条sql来update两张表?

( sbf胜博发娱乐城 )

表A,字段1
表B,字段1
如何一条sql更新两张表?
设置字段1=100,字段2=200
update 表A,表B,set 表A.字段1……这样吗?

UPDATE table1 AS a, table2 AS b, table3 AS c, ...
SET a.name = 'W', b.name = 'T', c.name = 'F', ...
WHERE a.id = 1 AND b.id = 2 AND c.id = 3

然而并不建议在一个sql里对两张无关联需求的表进行update操作。

建议开启一个事务完成两个表的更新操作。
start transaction;
update table A;
update table B;
commit;

为什么不尝试一下呢?

这么神奇的想法

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

sbf胜博发娱乐城yii2 多表联查 where条件里 A表字段=B表字段怎么表示

( sbf胜博发娱乐城 )

yii2 多表联查 where条件里 A表字段=B表字段怎么表示?

    $res =self::find()->select(['a.id','a.name'])
    ->join('LEFT JOIN','b','b.qid=a.id')
    ->join('LEFT JOIN','c','c.uid=b.uid')
    ->where(['a.state'=>0,'b.state'=>0,'c.state'=>0,'c.uid'=>123456])
    ->asArray()->all();
    

想在where条件里加上c.type=b.type怎么加???

$query->andWhere(new \yii\db\Expression('c.type = b.type'))

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

sbf胜博发娱乐城Mysql字段INT类型长度问题求指教、谢谢!

( sbf胜博发娱乐城 )

示例:tinyint(1)

说明:我所理解的Tinyint类型最大正数是255,不理解的是这里的1设置用途,其实就算设置长度为1,任然可以存入大于1位的数字。

疑惑:如果不需要填充零的情况下,这个长度限制还有意义吗?或者说还有必要设置么?

mysql为整数类型指定宽度,例如int(11),对于多数应用来说这是没有意义的:它不会限制值的合法范围,只是规定了mysql的一些交互工具(例如mysql命令行客户端)用来显示字符的个数。对于存储和计算来说,INT(1)和int(20)是相同的。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网Mac pip安装MySQL-python psycopg2报错

( 胜博发游戏官网 )

系统:macOS Sierra

pip install MySQL-python, pip install psycopg2均报以下错误:

ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'cc' failed with exit status 1

报错显示没有找到lssl这个库,我用Google搜索how to install lssl on mac 还是没有找到如何安装呀,请问这个问题我该怎么解决?谢谢

输入以下命令

xcode-select --install

解决了这个问题

应该装 openssl 相关软件包和库

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网mysql使用hiberna插入datetime值

( 胜博发游戏官网 )

create_time datetime DEFAULT NULL COMMENT '批次创建时间'
update_time datetime DEFAULT NULL COMMENT '最后更新时间'

record.setCreateTime(new Date());
record.setUpdateTime(new Date());

使用hibernate保存record对象,update_time的值保存到数据库了,但是create_time一直为空,为什么?

设置默认值为当前时间
create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '批次创建时间'
或者
create_time timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '批次创建时间'

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网mysql 分页查询优化。

( 胜博发游戏官网 )

table 表中30万记录 id,自增主键, node,create_at 都有索引 但是没有联合索引

下面的语句查一次要8s左右, 可以预估随着数据的继续增加,速度会越来越慢。 最近在学习 mysql 查询优化

也看了很多文章,教程(但是没有系统的看mysql手册,不好意思)

请各位朋友指导下,如何优化,如果可以 请大概讲述下,怎么分析的,为什么使用xxxx方式优化就会有效。

谢谢各位。

EXPLAIN
SELECT 
    `id` 
  FROM
    `table` 
  WHERE `node` = 2
  ORDER BY `create_at` DESC 
  LIMIT 12 OFFSET 69996

------------------------------------------------------------------------
           id: 1
  select_type: SIMPLE
        table: table
         type: ref
possible_keys: node
          key: node
      key_len: 5
          ref: const
         rows: 72278
        Extra: Using where; Using filesort

不要使用OFFSET方式分页
以你的例子来说

  1. MySQL会先查询所有符合条件的数据,通过EXPLAIN可以发现(72278),查询了这么多

  2. 因为OFFSET的关系,MySQL丢弃前面(69996)的记录。
    查询优化就是指在第1步的时候就让MySQL查询最少的数据。

我目前在用的分页方式(数据量千万级),依旧拿你的例子来说,假设分页大小为10
第一页

#查询1
SELECT 
    `id` 
  FROM
    `table` 
  WHERE `node` = 2
  ORDER BY `id` ASC
  LIMIT 10

假设查询1的第10条数据的id是10,第1条数据的id是1
那么查询第二页的SQL如下

SELECT 
    `id` 
  FROM
    `table` 
  WHERE `node` = 2 AND `id`>10
  ORDER BY `id` ASC
LIMIT 10

这样你可以发现响应速度超快。
不过有个问题是无法前往指定页数,不过从我目前的实际情况来看,这个没有影响,有个搜索功能就可以弥补

优化分页的问题其实就是offset的问题,尤其是偏移量大的时候。mysql会扫描大量不需要的行然后抛弃,只取limit的数量。所以一般最好不要用offset。解决方法有
1.可以先使用索引覆盖扫描,而不是查询所有的列,然后做关联操作返回相关的列。这个方法可以叫做“延迟关联”
2.可以把limit查询转换成已知位置的查询,变成between XXX and XXX 。
3.可以记录上次查询的数据的位置,下一次查询直接从该位置开始扫描,楼上就是用的这种办法。

鉴于问题好像只查询id一个字段。1方法用不到,2,3可以考虑。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城PDOStatement::bindValue中第三个参数到底起了什么作用?

( sbf胜博发娱乐城 )

有这样一个表:

username字段是varchar(20)。
查询是这样的:

$conn = new PDO(...);
$sql = "select * from user where username=:username";
$username=123;
$stmt=$conn->prepare($sql);
$stmt->bindValue(":username", $username, PDO::PARAM_STR);
$stmt->execute();
print_r($stmt->fetchAll());

我知道这里的$username其实写错了,应该是’123’,不过因为下边又把参数指定成PDO::PARAM_STR了所以查询到了2620这条。
但是当我突发奇想把PDO::PARAM_STR 改成PDO::PARAM_INT的时候,结果却是2620、2621两条都被查询出来了。
这个结果我十分不理解,那么这个PDO::PARAM_XXX到底做了什么?求明白的帮我解释一下,谢了。
好吧,敲完这个问题之后我直接在数据库里试了下select * from user where username=123,结果也是两条都出来,那就不是PDO的问题了,但是还是不明白为什么123不加引号会有这样的结果。

因为发生了强制类型转换. 你的username字段是字符型的, 字符和整型比较时会发生隐式转换.

select `1abc` = 1;     // 会显示1, 即true
select `abc` = 1;    //会显示0, 即false
select `abc` = 0;     //显示1

转换的规律可以参考下面的链接:
http://dev.mysql.com/doc/refm…

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

sbf胜博发娱乐城php mysql数据库存储html 代码,输出到浏览器时怎样正确解析,用的是啦 laravel框架

( sbf胜博发娱乐城 )

数据库中存储的html 代码;

目前浏览器输出的代码,如何正确的解析样式???

blade模板引擎中的{{ $xxx }}表达式的返回值将被自动传递给 PHP 的 htmlentities 函数进行处理,以防止 XSS 攻击。如果需要展示未转义的数据,可以使用{!! $xxx !!}.

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

SBF胜博发娱乐老虎机PHP MYSQL WHERE AND跟OR

( SBF胜博发娱乐老虎机 )

想請問一下該怎麼下where條件

WHERE `status` = '已完成' 
AND `type` = ''
AND `phone` LIKE '%{$user}%'
OR `phone2` LIKE '%{$user}%'
OR `address` LIKE '%{$user}%'
OR `name` LIKE '%{$user}%'
OR `email` LIKE '%{$user}%'
ORDER BY `buytime` DESC

條件是”status一定要是已完成 然後type一定要是空”
然後其他任一個有符合的都可以

我這樣子做會變成status不是已完成 type不是空的也會被搜索出來

WHERE `status` = '已完成' 
AND `type` = ''
and (
 `phone` LIKE '%{$user}%'
or`phone2` LIKE '%{$user}%'
OR `address` LIKE '%{$user}%'
OR `name` LIKE '%{$user}%'
OR `email` LIKE '%{$user}%'
)
ORDER BY `buytime` DESC

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

SBF胜博发娱乐老虎机idea debugmaven install 项目启动出现异常,求解决?

( SBF胜博发娱乐老虎机 )

FATAL ERROR in native method: JDWP Can’t allocate jvmti memory, jvmtiError=JVMTI_ERROR_INVALID_ENVIRONMENT(116)
JDWP exit error JVMTI_ERROR_WRONG_PHASE(112): on getting class status [util.c:1285]
JDWP exit error JVMTI_ERROR_INVALID_ENVIRONMENT(116): Can’t allocate jvmti memory [util.c:1799]
ERROR: JDWP unable to dispose of JVMTI environment: JVMTI_ERROR_INVALID_ENVIRONMENT(116)

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

sbf胜博发娱乐城mysql case when 查询一个效率问题

( sbf胜博发娱乐城 )

第一种:

SELECT
    `user`.username,
    `user`.email,
    `user`.id AS user_id,
    user_class.level_id,
    user_class.class_id AS cid,
    user_class.create_time AS bontime,
    class.graduation_time,
    class.offline_graduation_time,
    class.is_baidan,
    class. NAME AS class,
    class.period_id,
    class.offline_period_id,
    company. NAME AS branch,
    company.id AS bid
FROM
    `user_class`
INNER JOIN `user` ON user_class.user_id = `user`.id
INNER JOIN class ON user_class.class_id = class.id
LEFT JOIN company ON class.company_id = company.id
LEFT JOIN period ON class.period_id = period.id
WHERE
    class. DISABLE = 1
AND class.is_baidan IN ('1', '2')
AND `user_class`.level_id IN ('10', '12', '14')
AND CASE
WHEN is_baidan = 1 THEN
    class.graduation_time=0 
    OR class.graduation_time > 1469980800
WHEN is_baidan = 2 THEN
    class.offline_graduation_time = 0
    OR class.offline_graduation_time > 1469980800
END;

第二种:

SELECT
    `user`.username,
    `user`.email,
    `user`.id AS user_id,
    user_class.level_id,
    user_class.class_id AS cid,
    user_class.create_time AS bontime,
    class.graduation_time AS eontime,
    class.offline_graduation_time,
    class.is_baidan,
    class. NAME AS class,
    class.period_id,
    class.offline_period_id,
    company. NAME AS branch,
    company.id AS bid
FROM
    `user_class`
INNER JOIN `user` ON user_class.user_id = `user`.id
INNER JOIN class ON user_class.class_id = class.id
LEFT JOIN company ON class.company_id = company.id
LEFT JOIN period ON class.period_id = period.id
WHERE
    class. DISABLE = 1
AND `user_class`.level_id IN ('10', '12', '14')
AND (
    (
        class.is_baidan = 1 AND 
        (class.graduation_time = 0 OR class.graduation_time > 1469980800)
    )
    OR (
        class.is_baidan = 2 AND 
        (class.offline_graduation_time=0 OR class.offline_graduation_time >1469980800)
    )
);

这两个sql语句查询结果相同,想问问到底是哪个好一点

看mysql的执行计划,你这个sql语句不执行执行计划看,我觉得谁也告知不了你准确的答案,因为他们没有非常明显的性能差异。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

SBF胜博发娱乐老虎机应该怎么存储电影院的座位分布?

( SBF胜博发娱乐老虎机 )

如下图中的影院座位分布,应该怎么在服务器中存储不同影院的座位分布呢?

要啥二维数组,每个电影院都有自己的座位编号,存编号就 okay

但问题来了,每个电影院前端页面可能不一样啊,给商家一个坐席生成器,生成个序列,让前端显示只和座位编号关联,前端的座位编号序列单独保存一份,就妥了。

就算同一个电影院,不同厅座位可能完全不同,只有分离能解决。

只考虑分布不考虑座位状态的话,直接二维数组存就好了

并不是二维,就把座位按顺序编号,而且电影院肯定也是每个座位都有唯一编号。
数据库字段就一个编号就行了 编号:3-14 如果行列值读取频繁,那你可以增加两个冗余字段列 行:3 列:14 一共存三个字段, json的话不实用。

二维数组,没有座位的位置置为负值。

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

sbf胜博发娱乐城python问题,将从第三方接口获取的unicode存储到MySQL中,怎么处理的?

( sbf胜博发娱乐城 )

我是这么想的:

1 将unicode不作处理直接存到数据库:
这种方法我在INSERT数据的时候不会有warning,以后取数据的时候直接取出的是unicode处理也比较容易。
insert into table_1(name) VALUES("u'\u4e2d'");

2 转化成str存储到数据库:
u'中',encode成字符串,"\xe4\xb8\xad" ,这种方法在INSERT数据的时候会有warning,而且"\"会被去除,存储成"xe4xb8xad",而且会有warning。

不知道哪种方式更好,没有什么经验,求指导一下。

建连接的时候记得加use_unicode=True, charset="utf8"
insert的时候用参数传递cursor.execute("INSERT INTO table_1(name) VALUES(%s)", (u'\u4e2d', ))

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

sbf胜博发娱乐城将SQLServer数据同步到MySQL 用什么方法?

( sbf胜博发娱乐城 )

目的:将 SQLServer 数据表里的数据自动同步到 MySQL 的数据表里。
环境:两个数据库分别在两台服务器上;SQLServer表名为 tb1, MySQL表名为 tb2
同步方法:
1、实时同步:在 SQLServer 建立 ODBC 数据源,将 MySQL 数据库设置为系统DSN,然后建立链接服务器 mysql。在 tb1 表上建立插入、修改、删除触发器,自动更新MySQL表。
2、定时作业:还没用过,不会,谁能给个例子?谢谢。

问题:
1、方法1需要两台服务器都工作正常,MySQL不能关机或重启,否则会同步不成功。而且测试往 SQLServer 的tb1表中插入数据时,还报错:

链接服务器"mysql"的 OLE DB 访问接口 "MSDASQL" 返回了消息 "[MySQL][ODBC 5.2(w) Driver]Optional feature not supported"。

2、方法2定时作业,同步时同步 tb1 表中的全部数据还是只同步当天的数据?怎样区分?按时间吗?具体怎样同步到链接服务器 mysql 的 tb2 表中?

这两种同步方法哪种稳定?同时也好检查同步失败的数据?或者还有其它什么方法吗?(不用第三方软件)

希望有类似经验的大神们给个方案,十分感谢!

定时同步压力小点。如果你有两个字段created_atupdated_atcreated_at代表记录啥时候创建的,updated_at代表记录啥时候更新的。每次同步就就按照这两个字段把当前这个时段的记录select出来然后存储就OK了。

为啥不试试kettle,是一款ETL工具,用于数据抽取,支持各种数据库,而且也可以定时job,也可以中断续传,完全满足你的需求,之前公司用过,很好,很强大,可以试试。http://www.oschina.net/p/kettle 网上也有不少资料

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…