redis.go 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459
  1. package redis
  2. import (
  3. "errors"
  4. "fmt"
  5. "strconv"
  6. "time"
  7. red "github.com/go-redis/redis"
  8. "github.com/tal-tech/go-zero/core/breaker"
  9. "github.com/tal-tech/go-zero/core/mapping"
  10. )
  11. const (
  12. ClusterType = "cluster"
  13. NodeType = "node"
  14. Nil = red.Nil
  15. blockingQueryTimeout = 5 * time.Second
  16. readWriteTimeout = 2 * time.Second
  17. slowThreshold = time.Millisecond * 100
  18. )
  19. var ErrNilNode = errors.New("nil redis node")
  20. type (
  21. Pair struct {
  22. Key string
  23. Score int64
  24. }
  25. // thread-safe
  26. Redis struct {
  27. Addr string
  28. Type string
  29. Pass string
  30. brk breaker.Breaker
  31. }
  32. RedisNode interface {
  33. red.Cmdable
  34. }
  35. // GeoLocation is used with GeoAdd to add geospatial location.
  36. GeoLocation = red.GeoLocation
  37. // GeoRadiusQuery is used with GeoRadius to query geospatial index.
  38. GeoRadiusQuery = red.GeoRadiusQuery
  39. GeoPos = red.GeoPos
  40. Pipeliner = red.Pipeliner
  41. // Z represents sorted set member.
  42. Z = red.Z
  43. IntCmd = red.IntCmd
  44. FloatCmd = red.FloatCmd
  45. )
  46. func NewRedis(redisAddr, redisType string, redisPass ...string) *Redis {
  47. var pass string
  48. for _, v := range redisPass {
  49. pass = v
  50. }
  51. return &Redis{
  52. Addr: redisAddr,
  53. Type: redisType,
  54. Pass: pass,
  55. brk: breaker.NewBreaker(),
  56. }
  57. }
  58. // Use passed in redis connection to execute blocking queries
  59. // Doesn't benefit from pooling redis connections of blocking queries
  60. func (s *Redis) Blpop(redisNode RedisNode, key string) (string, error) {
  61. if redisNode == nil {
  62. return "", ErrNilNode
  63. }
  64. vals, err := redisNode.BLPop(blockingQueryTimeout, key).Result()
  65. if err != nil {
  66. return "", err
  67. }
  68. if len(vals) < 2 {
  69. return "", fmt.Errorf("no value on key: %s", key)
  70. } else {
  71. return vals[1], nil
  72. }
  73. }
  74. func (s *Redis) BlpopEx(redisNode RedisNode, key string) (string, bool, error) {
  75. if redisNode == nil {
  76. return "", false, ErrNilNode
  77. }
  78. vals, err := redisNode.BLPop(blockingQueryTimeout, key).Result()
  79. if err != nil {
  80. return "", false, err
  81. }
  82. if len(vals) < 2 {
  83. return "", false, fmt.Errorf("no value on key: %s", key)
  84. } else {
  85. return vals[1], true, nil
  86. }
  87. }
  88. func (s *Redis) Del(keys ...string) (val int, err error) {
  89. err = s.brk.DoWithAcceptable(func() error {
  90. conn, err := getRedis(s)
  91. if err != nil {
  92. return err
  93. }
  94. if v, err := conn.Del(keys...).Result(); err != nil {
  95. return err
  96. } else {
  97. val = int(v)
  98. return nil
  99. }
  100. }, acceptable)
  101. return
  102. }
  103. func (s *Redis) Eval(script string, keys []string, args ...interface{}) (val interface{}, err error) {
  104. err = s.brk.DoWithAcceptable(func() error {
  105. conn, err := getRedis(s)
  106. if err != nil {
  107. return err
  108. }
  109. val, err = conn.Eval(script, keys, args...).Result()
  110. return err
  111. }, acceptable)
  112. return
  113. }
  114. func (s *Redis) Exists(key string) (val bool, err error) {
  115. err = s.brk.DoWithAcceptable(func() error {
  116. conn, err := getRedis(s)
  117. if err != nil {
  118. return err
  119. }
  120. if v, err := conn.Exists(key).Result(); err != nil {
  121. return err
  122. } else {
  123. val = v == 1
  124. return nil
  125. }
  126. }, acceptable)
  127. return
  128. }
  129. func (s *Redis) Expire(key string, seconds int) error {
  130. return s.brk.DoWithAcceptable(func() error {
  131. conn, err := getRedis(s)
  132. if err != nil {
  133. return err
  134. }
  135. return conn.Expire(key, time.Duration(seconds)*time.Second).Err()
  136. }, acceptable)
  137. }
  138. func (s *Redis) Expireat(key string, expireTime int64) error {
  139. return s.brk.DoWithAcceptable(func() error {
  140. conn, err := getRedis(s)
  141. if err != nil {
  142. return err
  143. }
  144. return conn.ExpireAt(key, time.Unix(expireTime, 0)).Err()
  145. }, acceptable)
  146. }
  147. func (s *Redis) GeoAdd(key string, geoLocation ...*GeoLocation) (val int64, err error) {
  148. err = s.brk.DoWithAcceptable(func() error {
  149. conn, err := getRedis(s)
  150. if err != nil {
  151. return err
  152. }
  153. if v, err := conn.GeoAdd(key, geoLocation...).Result(); err != nil {
  154. return err
  155. } else {
  156. val = v
  157. return nil
  158. }
  159. }, acceptable)
  160. return
  161. }
  162. func (s *Redis) GeoDist(key string, member1, member2, unit string) (val float64, err error) {
  163. err = s.brk.DoWithAcceptable(func() error {
  164. conn, err := getRedis(s)
  165. if err != nil {
  166. return err
  167. }
  168. if v, err := conn.GeoDist(key, member1, member2, unit).Result(); err != nil {
  169. return err
  170. } else {
  171. val = v
  172. return nil
  173. }
  174. }, acceptable)
  175. return
  176. }
  177. func (s *Redis) GeoHash(key string, members ...string) (val []string, err error) {
  178. err = s.brk.DoWithAcceptable(func() error {
  179. conn, err := getRedis(s)
  180. if err != nil {
  181. return err
  182. }
  183. if v, err := conn.GeoHash(key, members...).Result(); err != nil {
  184. return err
  185. } else {
  186. val = v
  187. return nil
  188. }
  189. }, acceptable)
  190. return
  191. }
  192. func (s *Redis) GeoRadius(key string, longitude, latitude float64, query *GeoRadiusQuery) (val []GeoLocation, err error) {
  193. err = s.brk.DoWithAcceptable(func() error {
  194. conn, err := getRedis(s)
  195. if err != nil {
  196. return err
  197. }
  198. if v, err := conn.GeoRadius(key, longitude, latitude, query).Result(); err != nil {
  199. return err
  200. } else {
  201. val = v
  202. return nil
  203. }
  204. }, acceptable)
  205. return
  206. }
  207. func (s *Redis) GeoRadiusByMember(key, member string, query *GeoRadiusQuery) (val []GeoLocation, err error) {
  208. err = s.brk.DoWithAcceptable(func() error {
  209. conn, err := getRedis(s)
  210. if err != nil {
  211. return err
  212. }
  213. if v, err := conn.GeoRadiusByMember(key, member, query).Result(); err != nil {
  214. return err
  215. } else {
  216. val = v
  217. return nil
  218. }
  219. }, acceptable)
  220. return
  221. }
  222. func (s *Redis) GeoPos(key string, members ...string) (val []*GeoPos, err error) {
  223. err = s.brk.DoWithAcceptable(func() error {
  224. conn, err := getRedis(s)
  225. if err != nil {
  226. return err
  227. }
  228. if v, err := conn.GeoPos(key, members...).Result(); err != nil {
  229. return err
  230. } else {
  231. val = v
  232. return nil
  233. }
  234. }, acceptable)
  235. return
  236. }
  237. func (s *Redis) Get(key string) (val string, err error) {
  238. err = s.brk.DoWithAcceptable(func() error {
  239. conn, err := getRedis(s)
  240. if err != nil {
  241. return err
  242. }
  243. if val, err = conn.Get(key).Result(); err == red.Nil {
  244. return nil
  245. } else if err != nil {
  246. return err
  247. } else {
  248. return nil
  249. }
  250. }, acceptable)
  251. return
  252. }
  253. func (s *Redis) GetBit(key string, offset int64) (val int, err error) {
  254. err = s.brk.DoWithAcceptable(func() error {
  255. conn, err := getRedis(s)
  256. if err != nil {
  257. return err
  258. }
  259. if v, err := conn.GetBit(key, offset).Result(); err != nil {
  260. return err
  261. } else {
  262. val = int(v)
  263. return nil
  264. }
  265. }, acceptable)
  266. return
  267. }
  268. func (s *Redis) Hdel(key, field string) (val bool, err error) {
  269. err = s.brk.DoWithAcceptable(func() error {
  270. conn, err := getRedis(s)
  271. if err != nil {
  272. return err
  273. }
  274. if v, err := conn.HDel(key, field).Result(); err != nil {
  275. return err
  276. } else {
  277. val = v == 1
  278. return nil
  279. }
  280. }, acceptable)
  281. return
  282. }
  283. func (s *Redis) Hexists(key, field string) (val bool, err error) {
  284. err = s.brk.DoWithAcceptable(func() error {
  285. conn, err := getRedis(s)
  286. if err != nil {
  287. return err
  288. }
  289. val, err = conn.HExists(key, field).Result()
  290. return err
  291. }, acceptable)
  292. return
  293. }
  294. func (s *Redis) Hget(key, field string) (val string, err error) {
  295. err = s.brk.DoWithAcceptable(func() error {
  296. conn, err := getRedis(s)
  297. if err != nil {
  298. return err
  299. }
  300. val, err = conn.HGet(key, field).Result()
  301. return err
  302. }, acceptable)
  303. return
  304. }
  305. func (s *Redis) Hgetall(key string) (val map[string]string, err error) {
  306. err = s.brk.DoWithAcceptable(func() error {
  307. conn, err := getRedis(s)
  308. if err != nil {
  309. return err
  310. }
  311. val, err = conn.HGetAll(key).Result()
  312. return err
  313. }, acceptable)
  314. return
  315. }
  316. func (s *Redis) Hincrby(key, field string, increment int) (val int, err error) {
  317. err = s.brk.DoWithAcceptable(func() error {
  318. conn, err := getRedis(s)
  319. if err != nil {
  320. return err
  321. }
  322. if v, err := conn.HIncrBy(key, field, int64(increment)).Result(); err != nil {
  323. return err
  324. } else {
  325. val = int(v)
  326. return nil
  327. }
  328. }, acceptable)
  329. return
  330. }
  331. func (s *Redis) Hkeys(key string) (val []string, err error) {
  332. err = s.brk.DoWithAcceptable(func() error {
  333. conn, err := getRedis(s)
  334. if err != nil {
  335. return err
  336. }
  337. val, err = conn.HKeys(key).Result()
  338. return err
  339. }, acceptable)
  340. return
  341. }
  342. func (s *Redis) Hlen(key string) (val int, err error) {
  343. err = s.brk.DoWithAcceptable(func() error {
  344. conn, err := getRedis(s)
  345. if err != nil {
  346. return err
  347. }
  348. if v, err := conn.HLen(key).Result(); err != nil {
  349. return err
  350. } else {
  351. val = int(v)
  352. return nil
  353. }
  354. }, acceptable)
  355. return
  356. }
  357. func (s *Redis) Hmget(key string, fields ...string) (val []string, err error) {
  358. err = s.brk.DoWithAcceptable(func() error {
  359. conn, err := getRedis(s)
  360. if err != nil {
  361. return err
  362. }
  363. if v, err := conn.HMGet(key, fields...).Result(); err != nil {
  364. return err
  365. } else {
  366. val = toStrings(v)
  367. return nil
  368. }
  369. }, acceptable)
  370. return
  371. }
  372. func (s *Redis) Hset(key, field, value string) error {
  373. return s.brk.DoWithAcceptable(func() error {
  374. conn, err := getRedis(s)
  375. if err != nil {
  376. return err
  377. }
  378. return conn.HSet(key, field, value).Err()
  379. }, acceptable)
  380. }
  381. func (s *Redis) Hsetnx(key, field, value string) (val bool, err error) {
  382. err = s.brk.DoWithAcceptable(func() error {
  383. conn, err := getRedis(s)
  384. if err != nil {
  385. return err
  386. }
  387. val, err = conn.HSetNX(key, field, value).Result()
  388. return err
  389. }, acceptable)
  390. return
  391. }
  392. func (s *Redis) Hmset(key string, fieldsAndValues map[string]string) error {
  393. return s.brk.DoWithAcceptable(func() error {
  394. conn, err := getRedis(s)
  395. if err != nil {
  396. return err
  397. }
  398. vals := make(map[string]interface{}, len(fieldsAndValues))
  399. for k, v := range fieldsAndValues {
  400. vals[k] = v
  401. }
  402. return conn.HMSet(key, vals).Err()
  403. }, acceptable)
  404. }
  405. func (s *Redis) Hvals(key string) (val []string, err error) {
  406. err = s.brk.DoWithAcceptable(func() error {
  407. conn, err := getRedis(s)
  408. if err != nil {
  409. return err
  410. }
  411. val, err = conn.HVals(key).Result()
  412. return err
  413. }, acceptable)
  414. return
  415. }
  416. func (s *Redis) Incr(key string) (val int64, err error) {
  417. err = s.brk.DoWithAcceptable(func() error {
  418. conn, err := getRedis(s)
  419. if err != nil {
  420. return err
  421. }
  422. val, err = conn.Incr(key).Result()
  423. return err
  424. }, acceptable)
  425. return
  426. }
  427. func (s *Redis) Incrby(key string, increment int64) (val int64, err error) {
  428. err = s.brk.DoWithAcceptable(func() error {
  429. conn, err := getRedis(s)
  430. if err != nil {
  431. return err
  432. }
  433. val, err = conn.IncrBy(key, int64(increment)).Result()
  434. return err
  435. }, acceptable)
  436. return
  437. }
  438. func (s *Redis) Keys(pattern string) (val []string, err error) {
  439. err = s.brk.DoWithAcceptable(func() error {
  440. conn, err := getRedis(s)
  441. if err != nil {
  442. return err
  443. }
  444. val, err = conn.Keys(pattern).Result()
  445. return err
  446. }, acceptable)
  447. return
  448. }
  449. func (s *Redis) Llen(key string) (val int, err error) {
  450. err = s.brk.DoWithAcceptable(func() error {
  451. conn, err := getRedis(s)
  452. if err != nil {
  453. return err
  454. }
  455. if v, err := conn.LLen(key).Result(); err != nil {
  456. return err
  457. } else {
  458. val = int(v)
  459. return nil
  460. }
  461. }, acceptable)
  462. return
  463. }
  464. func (s *Redis) Lpop(key string) (val string, err error) {
  465. err = s.brk.DoWithAcceptable(func() error {
  466. conn, err := getRedis(s)
  467. if err != nil {
  468. return err
  469. }
  470. val, err = conn.LPop(key).Result()
  471. return err
  472. }, acceptable)
  473. return
  474. }
  475. func (s *Redis) Lpush(key string, values ...interface{}) (val int, err error) {
  476. err = s.brk.DoWithAcceptable(func() error {
  477. conn, err := getRedis(s)
  478. if err != nil {
  479. return err
  480. }
  481. if v, err := conn.LPush(key, values...).Result(); err != nil {
  482. return err
  483. } else {
  484. val = int(v)
  485. return nil
  486. }
  487. }, acceptable)
  488. return
  489. }
  490. func (s *Redis) Lrange(key string, start int, stop int) (val []string, err error) {
  491. err = s.brk.DoWithAcceptable(func() error {
  492. conn, err := getRedis(s)
  493. if err != nil {
  494. return err
  495. }
  496. val, err = conn.LRange(key, int64(start), int64(stop)).Result()
  497. return err
  498. }, acceptable)
  499. return
  500. }
  501. func (s *Redis) Lrem(key string, count int, value string) (val int, err error) {
  502. err = s.brk.DoWithAcceptable(func() error {
  503. conn, err := getRedis(s)
  504. if err != nil {
  505. return err
  506. }
  507. if v, err := conn.LRem(key, int64(count), value).Result(); err != nil {
  508. return err
  509. } else {
  510. val = int(v)
  511. return nil
  512. }
  513. }, acceptable)
  514. return
  515. }
  516. func (s *Redis) Mget(keys ...string) (val []string, err error) {
  517. err = s.brk.DoWithAcceptable(func() error {
  518. conn, err := getRedis(s)
  519. if err != nil {
  520. return err
  521. }
  522. if v, err := conn.MGet(keys...).Result(); err != nil {
  523. return err
  524. } else {
  525. val = toStrings(v)
  526. return nil
  527. }
  528. }, acceptable)
  529. return
  530. }
  531. func (s *Redis) Persist(key string) (val bool, err error) {
  532. err = s.brk.DoWithAcceptable(func() error {
  533. conn, err := getRedis(s)
  534. if err != nil {
  535. return err
  536. }
  537. val, err = conn.Persist(key).Result()
  538. return err
  539. }, acceptable)
  540. return
  541. }
  542. func (s *Redis) Pfadd(key string, values ...interface{}) (val bool, err error) {
  543. err = s.brk.DoWithAcceptable(func() error {
  544. conn, err := getRedis(s)
  545. if err != nil {
  546. return err
  547. }
  548. if v, err := conn.PFAdd(key, values...).Result(); err != nil {
  549. return err
  550. } else {
  551. val = v == 1
  552. return nil
  553. }
  554. }, acceptable)
  555. return
  556. }
  557. func (s *Redis) Pfcount(key string) (val int64, err error) {
  558. err = s.brk.DoWithAcceptable(func() error {
  559. conn, err := getRedis(s)
  560. if err != nil {
  561. return err
  562. }
  563. val, err = conn.PFCount(key).Result()
  564. return err
  565. }, acceptable)
  566. return
  567. }
  568. func (s *Redis) Pfmerge(dest string, keys ...string) error {
  569. return s.brk.DoWithAcceptable(func() error {
  570. conn, err := getRedis(s)
  571. if err != nil {
  572. return err
  573. }
  574. _, err = conn.PFMerge(dest, keys...).Result()
  575. return err
  576. }, acceptable)
  577. }
  578. func (s *Redis) Ping() (val bool) {
  579. // ignore error, error means false
  580. _ = s.brk.DoWithAcceptable(func() error {
  581. conn, err := getRedis(s)
  582. if err != nil {
  583. val = false
  584. return nil
  585. }
  586. if v, err := conn.Ping().Result(); err != nil {
  587. val = false
  588. return nil
  589. } else {
  590. val = v == "PONG"
  591. return nil
  592. }
  593. }, acceptable)
  594. return
  595. }
  596. func (s *Redis) Pipelined(fn func(Pipeliner) error) (err error) {
  597. err = s.brk.DoWithAcceptable(func() error {
  598. conn, err := getRedis(s)
  599. if err != nil {
  600. return err
  601. }
  602. _, err = conn.Pipelined(fn)
  603. return err
  604. }, acceptable)
  605. return
  606. }
  607. func (s *Redis) Rpush(key string, values ...interface{}) (val int, err error) {
  608. err = s.brk.DoWithAcceptable(func() error {
  609. conn, err := getRedis(s)
  610. if err != nil {
  611. return err
  612. }
  613. if v, err := conn.RPush(key, values...).Result(); err != nil {
  614. return err
  615. } else {
  616. val = int(v)
  617. return nil
  618. }
  619. }, acceptable)
  620. return
  621. }
  622. func (s *Redis) Sadd(key string, values ...interface{}) (val int, err error) {
  623. err = s.brk.DoWithAcceptable(func() error {
  624. conn, err := getRedis(s)
  625. if err != nil {
  626. return err
  627. }
  628. if v, err := conn.SAdd(key, values...).Result(); err != nil {
  629. return err
  630. } else {
  631. val = int(v)
  632. return nil
  633. }
  634. }, acceptable)
  635. return
  636. }
  637. func (s *Redis) Scan(cursor uint64, match string, count int64) (keys []string, cur uint64, err error) {
  638. err = s.brk.DoWithAcceptable(func() error {
  639. conn, err := getRedis(s)
  640. if err != nil {
  641. return err
  642. }
  643. keys, cur, err = conn.Scan(cursor, match, count).Result()
  644. return err
  645. }, acceptable)
  646. return
  647. }
  648. func (s *Redis) SetBit(key string, offset int64, value int) error {
  649. return s.brk.DoWithAcceptable(func() error {
  650. conn, err := getRedis(s)
  651. if err != nil {
  652. return err
  653. }
  654. _, err = conn.SetBit(key, offset, value).Result()
  655. return err
  656. }, acceptable)
  657. }
  658. func (s *Redis) Sscan(key string, cursor uint64, match string, count int64) (keys []string, cur uint64, err error) {
  659. err = s.brk.DoWithAcceptable(func() error {
  660. conn, err := getRedis(s)
  661. if err != nil {
  662. return err
  663. }
  664. keys, cur, err = conn.SScan(key, cursor, match, count).Result()
  665. return err
  666. }, acceptable)
  667. return
  668. }
  669. func (s *Redis) Scard(key string) (val int64, err error) {
  670. err = s.brk.DoWithAcceptable(func() error {
  671. conn, err := getRedis(s)
  672. if err != nil {
  673. return err
  674. }
  675. val, err = conn.SCard(key).Result()
  676. return err
  677. }, acceptable)
  678. return
  679. }
  680. func (s *Redis) Set(key string, value string) error {
  681. return s.brk.DoWithAcceptable(func() error {
  682. conn, err := getRedis(s)
  683. if err != nil {
  684. return err
  685. }
  686. return conn.Set(key, value, 0).Err()
  687. }, acceptable)
  688. }
  689. func (s *Redis) Setex(key, value string, seconds int) error {
  690. return s.brk.DoWithAcceptable(func() error {
  691. conn, err := getRedis(s)
  692. if err != nil {
  693. return err
  694. }
  695. return conn.Set(key, value, time.Duration(seconds)*time.Second).Err()
  696. }, acceptable)
  697. }
  698. func (s *Redis) Setnx(key, value string) (val bool, err error) {
  699. err = s.brk.DoWithAcceptable(func() error {
  700. conn, err := getRedis(s)
  701. if err != nil {
  702. return err
  703. }
  704. val, err = conn.SetNX(key, value, 0).Result()
  705. return err
  706. }, acceptable)
  707. return
  708. }
  709. func (s *Redis) SetnxEx(key, value string, seconds int) (val bool, err error) {
  710. err = s.brk.DoWithAcceptable(func() error {
  711. conn, err := getRedis(s)
  712. if err != nil {
  713. return err
  714. }
  715. val, err = conn.SetNX(key, value, time.Duration(seconds)*time.Second).Result()
  716. return err
  717. }, acceptable)
  718. return
  719. }
  720. func (s *Redis) Sismember(key string, value interface{}) (val bool, err error) {
  721. err = s.brk.DoWithAcceptable(func() error {
  722. conn, err := getRedis(s)
  723. if err != nil {
  724. return err
  725. }
  726. val, err = conn.SIsMember(key, value).Result()
  727. return err
  728. }, acceptable)
  729. return
  730. }
  731. func (s *Redis) Srem(key string, values ...interface{}) (val int, err error) {
  732. err = s.brk.DoWithAcceptable(func() error {
  733. conn, err := getRedis(s)
  734. if err != nil {
  735. return err
  736. }
  737. if v, err := conn.SRem(key, values...).Result(); err != nil {
  738. return err
  739. } else {
  740. val = int(v)
  741. return nil
  742. }
  743. }, acceptable)
  744. return
  745. }
  746. func (s *Redis) Smembers(key string) (val []string, err error) {
  747. err = s.brk.DoWithAcceptable(func() error {
  748. conn, err := getRedis(s)
  749. if err != nil {
  750. return err
  751. }
  752. val, err = conn.SMembers(key).Result()
  753. return err
  754. }, acceptable)
  755. return
  756. }
  757. func (s *Redis) Spop(key string) (val string, err error) {
  758. err = s.brk.DoWithAcceptable(func() error {
  759. conn, err := getRedis(s)
  760. if err != nil {
  761. return err
  762. }
  763. val, err = conn.SPop(key).Result()
  764. return err
  765. }, acceptable)
  766. return
  767. }
  768. func (s *Redis) Srandmember(key string, count int) (val []string, err error) {
  769. err = s.brk.DoWithAcceptable(func() error {
  770. conn, err := getRedis(s)
  771. if err != nil {
  772. return err
  773. }
  774. val, err = conn.SRandMemberN(key, int64(count)).Result()
  775. return err
  776. }, acceptable)
  777. return
  778. }
  779. func (s *Redis) Sunion(keys ...string) (val []string, err error) {
  780. err = s.brk.DoWithAcceptable(func() error {
  781. conn, err := getRedis(s)
  782. if err != nil {
  783. return err
  784. }
  785. val, err = conn.SUnion(keys...).Result()
  786. return err
  787. }, acceptable)
  788. return
  789. }
  790. func (s *Redis) Sunionstore(destination string, keys ...string) (val int, err error) {
  791. err = s.brk.DoWithAcceptable(func() error {
  792. conn, err := getRedis(s)
  793. if err != nil {
  794. return err
  795. }
  796. if v, err := conn.SUnionStore(destination, keys...).Result(); err != nil {
  797. return err
  798. } else {
  799. val = int(v)
  800. return nil
  801. }
  802. }, acceptable)
  803. return
  804. }
  805. func (s *Redis) Sdiff(keys ...string) (val []string, err error) {
  806. err = s.brk.DoWithAcceptable(func() error {
  807. conn, err := getRedis(s)
  808. if err != nil {
  809. return err
  810. }
  811. val, err = conn.SDiff(keys...).Result()
  812. return err
  813. }, acceptable)
  814. return
  815. }
  816. func (s *Redis) Sdiffstore(destination string, keys ...string) (val int, err error) {
  817. err = s.brk.DoWithAcceptable(func() error {
  818. conn, err := getRedis(s)
  819. if err != nil {
  820. return err
  821. }
  822. if v, err := conn.SDiffStore(destination, keys...).Result(); err != nil {
  823. return err
  824. } else {
  825. val = int(v)
  826. return nil
  827. }
  828. }, acceptable)
  829. return
  830. }
  831. func (s *Redis) Ttl(key string) (val int, err error) {
  832. err = s.brk.DoWithAcceptable(func() error {
  833. conn, err := getRedis(s)
  834. if err != nil {
  835. return err
  836. }
  837. if duration, err := conn.TTL(key).Result(); err != nil {
  838. return err
  839. } else {
  840. val = int(duration / time.Second)
  841. return nil
  842. }
  843. }, acceptable)
  844. return
  845. }
  846. func (s *Redis) Zadd(key string, score int64, value string) (val bool, err error) {
  847. err = s.brk.DoWithAcceptable(func() error {
  848. conn, err := getRedis(s)
  849. if err != nil {
  850. return err
  851. }
  852. if v, err := conn.ZAdd(key, red.Z{
  853. Score: float64(score),
  854. Member: value,
  855. }).Result(); err != nil {
  856. return err
  857. } else {
  858. val = v == 1
  859. return nil
  860. }
  861. }, acceptable)
  862. return
  863. }
  864. func (s *Redis) Zadds(key string, ps ...Pair) (val int64, err error) {
  865. err = s.brk.DoWithAcceptable(func() error {
  866. conn, err := getRedis(s)
  867. if err != nil {
  868. return err
  869. }
  870. var zs []red.Z
  871. for _, p := range ps {
  872. z := red.Z{Score: float64(p.Score), Member: p.Key}
  873. zs = append(zs, z)
  874. }
  875. if v, err := conn.ZAdd(key, zs...).Result(); err != nil {
  876. return err
  877. } else {
  878. val = v
  879. return nil
  880. }
  881. }, acceptable)
  882. return
  883. }
  884. func (s *Redis) Zcard(key string) (val int, err error) {
  885. err = s.brk.DoWithAcceptable(func() error {
  886. conn, err := getRedis(s)
  887. if err != nil {
  888. return err
  889. }
  890. if v, err := conn.ZCard(key).Result(); err != nil {
  891. return err
  892. } else {
  893. val = int(v)
  894. return nil
  895. }
  896. }, acceptable)
  897. return
  898. }
  899. func (s *Redis) Zcount(key string, start, stop int64) (val int, err error) {
  900. err = s.brk.DoWithAcceptable(func() error {
  901. conn, err := getRedis(s)
  902. if err != nil {
  903. return err
  904. }
  905. if v, err := conn.ZCount(key, strconv.FormatInt(start, 10),
  906. strconv.FormatInt(stop, 10)).Result(); err != nil {
  907. return err
  908. } else {
  909. val = int(v)
  910. return nil
  911. }
  912. }, acceptable)
  913. return
  914. }
  915. func (s *Redis) Zincrby(key string, increment int64, field string) (val int64, err error) {
  916. err = s.brk.DoWithAcceptable(func() error {
  917. conn, err := getRedis(s)
  918. if err != nil {
  919. return err
  920. }
  921. if v, err := conn.ZIncrBy(key, float64(increment), field).Result(); err != nil {
  922. return err
  923. } else {
  924. val = int64(v)
  925. return nil
  926. }
  927. }, acceptable)
  928. return
  929. }
  930. func (s *Redis) Zscore(key string, value string) (val int64, err error) {
  931. err = s.brk.DoWithAcceptable(func() error {
  932. conn, err := getRedis(s)
  933. if err != nil {
  934. return err
  935. }
  936. if v, err := conn.ZScore(key, value).Result(); err != nil {
  937. return err
  938. } else {
  939. val = int64(v)
  940. return nil
  941. }
  942. }, acceptable)
  943. return
  944. }
  945. func (s *Redis) Zrank(key, field string) (val int64, err error) {
  946. err = s.brk.DoWithAcceptable(func() error {
  947. conn, err := getRedis(s)
  948. if err != nil {
  949. return err
  950. }
  951. val, err = conn.ZRank(key, field).Result()
  952. return err
  953. }, acceptable)
  954. return
  955. }
  956. func (s *Redis) Zrem(key string, values ...interface{}) (val int, err error) {
  957. err = s.brk.DoWithAcceptable(func() error {
  958. conn, err := getRedis(s)
  959. if err != nil {
  960. return err
  961. }
  962. if v, err := conn.ZRem(key, values...).Result(); err != nil {
  963. return err
  964. } else {
  965. val = int(v)
  966. return nil
  967. }
  968. }, acceptable)
  969. return
  970. }
  971. func (s *Redis) Zremrangebyscore(key string, start, stop int64) (val int, err error) {
  972. err = s.brk.DoWithAcceptable(func() error {
  973. conn, err := getRedis(s)
  974. if err != nil {
  975. return err
  976. }
  977. if v, err := conn.ZRemRangeByScore(key, strconv.FormatInt(start, 10),
  978. strconv.FormatInt(stop, 10)).Result(); err != nil {
  979. return err
  980. } else {
  981. val = int(v)
  982. return nil
  983. }
  984. }, acceptable)
  985. return
  986. }
  987. func (s *Redis) Zremrangebyrank(key string, start, stop int64) (val int, err error) {
  988. err = s.brk.DoWithAcceptable(func() error {
  989. conn, err := getRedis(s)
  990. if err != nil {
  991. return err
  992. }
  993. if v, err := conn.ZRemRangeByRank(key, start, stop).Result(); err != nil {
  994. return err
  995. } else {
  996. val = int(v)
  997. return nil
  998. }
  999. }, acceptable)
  1000. return
  1001. }
  1002. func (s *Redis) Zrange(key string, start, stop int64) (val []string, err error) {
  1003. err = s.brk.DoWithAcceptable(func() error {
  1004. conn, err := getRedis(s)
  1005. if err != nil {
  1006. return err
  1007. }
  1008. val, err = conn.ZRange(key, start, stop).Result()
  1009. return err
  1010. }, acceptable)
  1011. return
  1012. }
  1013. func (s *Redis) ZrangeWithScores(key string, start, stop int64) (val []Pair, err error) {
  1014. err = s.brk.DoWithAcceptable(func() error {
  1015. conn, err := getRedis(s)
  1016. if err != nil {
  1017. return err
  1018. }
  1019. if v, err := conn.ZRangeWithScores(key, start, stop).Result(); err != nil {
  1020. return err
  1021. } else {
  1022. val = toPairs(v)
  1023. return nil
  1024. }
  1025. }, acceptable)
  1026. return
  1027. }
  1028. func (s *Redis) ZRevRangeWithScores(key string, start, stop int64) (val []Pair, err error) {
  1029. err = s.brk.DoWithAcceptable(func() error {
  1030. conn, err := getRedis(s)
  1031. if err != nil {
  1032. return err
  1033. }
  1034. if v, err := conn.ZRevRangeWithScores(key, start, stop).Result(); err != nil {
  1035. return err
  1036. } else {
  1037. val = toPairs(v)
  1038. return nil
  1039. }
  1040. }, acceptable)
  1041. return
  1042. }
  1043. func (s *Redis) ZrangebyscoreWithScores(key string, start, stop int64) (val []Pair, err error) {
  1044. err = s.brk.DoWithAcceptable(func() error {
  1045. conn, err := getRedis(s)
  1046. if err != nil {
  1047. return err
  1048. }
  1049. if v, err := conn.ZRangeByScoreWithScores(key, red.ZRangeBy{
  1050. Min: strconv.FormatInt(start, 10),
  1051. Max: strconv.FormatInt(stop, 10),
  1052. }).Result(); err != nil {
  1053. return err
  1054. } else {
  1055. val = toPairs(v)
  1056. return nil
  1057. }
  1058. }, acceptable)
  1059. return
  1060. }
  1061. func (s *Redis) ZrangebyscoreWithScoresAndLimit(key string, start, stop int64, page, size int) (
  1062. val []Pair, err error) {
  1063. err = s.brk.DoWithAcceptable(func() error {
  1064. if size <= 0 {
  1065. return nil
  1066. }
  1067. conn, err := getRedis(s)
  1068. if err != nil {
  1069. return err
  1070. }
  1071. if v, err := conn.ZRangeByScoreWithScores(key, red.ZRangeBy{
  1072. Min: strconv.FormatInt(start, 10),
  1073. Max: strconv.FormatInt(stop, 10),
  1074. Offset: int64(page * size),
  1075. Count: int64(size),
  1076. }).Result(); err != nil {
  1077. return err
  1078. } else {
  1079. val = toPairs(v)
  1080. return nil
  1081. }
  1082. }, acceptable)
  1083. return
  1084. }
  1085. func (s *Redis) Zrevrange(key string, start, stop int64) (val []string, err error) {
  1086. err = s.brk.DoWithAcceptable(func() error {
  1087. conn, err := getRedis(s)
  1088. if err != nil {
  1089. return err
  1090. }
  1091. val, err = conn.ZRevRange(key, start, stop).Result()
  1092. return err
  1093. }, acceptable)
  1094. return
  1095. }
  1096. func (s *Redis) ZrevrangebyscoreWithScores(key string, start, stop int64) (val []Pair, err error) {
  1097. err = s.brk.DoWithAcceptable(func() error {
  1098. conn, err := getRedis(s)
  1099. if err != nil {
  1100. return err
  1101. }
  1102. if v, err := conn.ZRevRangeByScoreWithScores(key, red.ZRangeBy{
  1103. Min: strconv.FormatInt(start, 10),
  1104. Max: strconv.FormatInt(stop, 10),
  1105. }).Result(); err != nil {
  1106. return err
  1107. } else {
  1108. val = toPairs(v)
  1109. return nil
  1110. }
  1111. }, acceptable)
  1112. return
  1113. }
  1114. func (s *Redis) ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64, page, size int) (
  1115. val []Pair, err error) {
  1116. err = s.brk.DoWithAcceptable(func() error {
  1117. if size <= 0 {
  1118. return nil
  1119. }
  1120. conn, err := getRedis(s)
  1121. if err != nil {
  1122. return err
  1123. }
  1124. if v, err := conn.ZRevRangeByScoreWithScores(key, red.ZRangeBy{
  1125. Min: strconv.FormatInt(start, 10),
  1126. Max: strconv.FormatInt(stop, 10),
  1127. Offset: int64(page * size),
  1128. Count: int64(size),
  1129. }).Result(); err != nil {
  1130. return err
  1131. } else {
  1132. val = toPairs(v)
  1133. return nil
  1134. }
  1135. }, acceptable)
  1136. return
  1137. }
  1138. func (s *Redis) Zrevrank(key string, field string) (val int64, err error) {
  1139. err = s.brk.DoWithAcceptable(func() error {
  1140. conn, err := getRedis(s)
  1141. if err != nil {
  1142. return err
  1143. }
  1144. val, err = conn.ZRevRank(key, field).Result()
  1145. return err
  1146. }, acceptable)
  1147. return
  1148. }
  1149. func (s *Redis) String() string {
  1150. return s.Addr
  1151. }
  1152. func (s *Redis) scriptLoad(script string) (string, error) {
  1153. conn, err := getRedis(s)
  1154. if err != nil {
  1155. return "", err
  1156. }
  1157. return conn.ScriptLoad(script).Result()
  1158. }
  1159. func acceptable(err error) bool {
  1160. return err == nil || err == red.Nil
  1161. }
  1162. func getRedis(r *Redis) (RedisNode, error) {
  1163. switch r.Type {
  1164. case ClusterType:
  1165. return getCluster(r.Addr, r.Pass)
  1166. case NodeType:
  1167. return getClient(r.Addr, r.Pass)
  1168. default:
  1169. return nil, fmt.Errorf("redis type '%s' is not supported", r.Type)
  1170. }
  1171. }
  1172. func toPairs(vals []red.Z) []Pair {
  1173. pairs := make([]Pair, len(vals))
  1174. for i, val := range vals {
  1175. switch member := val.Member.(type) {
  1176. case string:
  1177. pairs[i] = Pair{
  1178. Key: member,
  1179. Score: int64(val.Score),
  1180. }
  1181. default:
  1182. pairs[i] = Pair{
  1183. Key: mapping.Repr(val.Member),
  1184. Score: int64(val.Score),
  1185. }
  1186. }
  1187. }
  1188. return pairs
  1189. }
  1190. func toStrings(vals []interface{}) []string {
  1191. ret := make([]string, len(vals))
  1192. for i, val := range vals {
  1193. if val == nil {
  1194. ret[i] = ""
  1195. } else {
  1196. switch val := val.(type) {
  1197. case string:
  1198. ret[i] = val
  1199. default:
  1200. ret[i] = mapping.Repr(val)
  1201. }
  1202. }
  1203. }
  1204. return ret
  1205. }